java-enum-tai-sao-nen-su-dung

Java Enum là gì?. Tại sao nên sử dụng enum?

Trước khi bắt đầu, để hiểu rõ tại sao Senior Dev lại luôn sử dụng Java Enum, các bạn có thể tham khảo bài viết này.

1. Enum là gì?

1.1 Định nghĩa.

Định nghĩa thì nhàm chán, nhưng không đọc không được. =)))

A Java Enum is a special Java type used to define collections of constants. More precisely, a Java enum type is a special kind of Java class. An enum can contain constants, methods etc. Java enums were added in Java 5.

Java Enum là một kiểu đặc biệt sử dụng để định nghĩa một collections of constants (tập các giá trị cố định). Chính xác hơn, kiểu enum là một lớp Java đặt biệt. Enums có thể chứa các giá trị constants, method, … Java enums được thêm vào từ Java 5.
Anh chàng Enum dễ thương.
Anh chàng Enums mặt thộn – nhưng code chuẩn thì nên có anh chàng này!.

1.2 Ví dụ.

Ví dụ kinh điển của Java, lụm từ W3Schools .

// Trình trong trình độ. Chứ đ*o phải trinh.
enum Trinh {
  LOW,
  MEDIUM,
  HIGH
}

public class HocCuaGai { 
  public static void main(String[] args) { 
    // Trình còi, cưa gái không nổi.
    Trinh cuagai = Trinh.LOW; 
    // Chả muốn viết dòng này.
    System.out.println(cuagai); 
  } 
}

2. Đôi điều thú vị.

public class DoDen {
    public final String nuocBai;
  
  	public static final DoDen CO = new DoDen("CƠ");
   	public static final DoDen RO = new DoDen("RÔ");
  	public static final DoDen CHUON = new DoDen("CHUỒN");
  	public static final DoDen BICH = new DoDen("BÍCH");
  
  	private DoDen(String nuocBai) {
    	this.nuocBai = nuocBai;
    }
    
  	public String toString() {
      	return nuocBai;
    }
}

You can’t instantiate an enum using the new operator.

Bạn không thể tạo ra một instance mới cho enum bằng từ khóa new.

2.1 Pass enum như parameter.

Các giá trị bên trong Enum có thể được truyền đi như tham số. Tuy nhiên, không thể pass parameter bằng cách new instance của enum.

public enum File {
    READ,
    WRITE
}

Có thể lấy được giá trị đầu tiên khai báo trong Enum bằng cách sau:

public class FileTest {
    public static void main(String[] args) {
        testEnumFile(File.values()[0]);
    }
}

2.2 Không extends class nhưng implement interface.

Java enums implicitly extend the java.lang.Enum class. Therefore, Java enums can’t extend any class. But, enums can implement different interfaces.

Java enum đã extend lớp java.lang.Enum. Do đó, nó không thể extend thêm bất kì class nào khác. Tuy nhiên, enums có thể implement nhiều interfaces.

Cũng không quá khó hiểu. Trong Java, do không hỗ trợ đa kế thừa (multiple inheritance), nên chỉ có thể extends một class duy nhất.

Tuy nhiên, do enums entends class java.lang.Enum, nên có thể implement interface. Cùng xem xét ví dụ sau:

package com.kieblog.enums;
public interface Operator {
  int calculate(int num1, int num2);
}

Khi khai báo EnumOperator, ta có thể implement được interface Operator.

public enum EnumOperator implements Operator {
  // Nhân 2 số.
  MUTIPLE {
    @Override
    public int calculate(int num1, int num2) {
      return num1 * num2;
    }
  },
  // Trừ 2 số.
  SUBTRACT {
    @Override
    public int calculate(int num1, int num2) {
      return num1 - num2;
    }
  };
}

Việc implement được interface giúp enums không chỉ đơn thuần là tập collections constants (màu sắc, ngày trong tuần, …). Khi đã có thể implement thêm, enums trở nên dạt dào sức mạnh (có thể là các object phức tạp với hàm tính toán, xử lí dữ liệu hoặc là Printable, Reportable).

3. Tại sao nên sử dụng Enum

Đang máu đỏ đen, nên ví dụ luôn các nước bài (Cơ, rô, chuồn, bích).

Provides compile time type safety.

Kiểu lúc compile time an toàn.

Can translate enums into printable strings.

Có thể chuyển đổi enums sang kiểu có thể in ra được (method toString()).

3.1 Dễ đọc.

Một đoạn code tốt là một đoạn code dễ đọc, điều đó sẽ đúng khi bạn sử dụng Enum. Thay vì sử dụng một mớ bùi nhùi dài dằng dặc static final constant, chỉ với một khai báo enum, mọi thứ trở nên rõ ràng, easy cho việc sửa chữa, đọc code.

Việc sử dụng quá nhiều constant có thể dẫn tới việc sửa chữa nhầm lẫn, không phân định rõ đoạn khai báo constant.
Sử dụng enum sẽ cho một đoạn code dễ đọc, dễ maintenance.

3.2 Sử dụng enum như là singleton.

Đầu tiên, bạn nào chưa biết khái niệm singleton có thể tham khảo bài viết này.

In object-oriented programming, a singleton class is a class that can have only one object (an instance of the class) at a time.

Trong lập trình hướng đối tượng, một class singleton là class chỉ có một đối tượng (một thể hiện của lớp) tại một thời điểm. Dịch khó vl.
public enum Ensure_Singleton {
    INSTANCE;
}

Cực kì tiện dụng, chỉ với 3 dòng trên, một class Singleton hoàn hảo được tạo ra. Class enum cũng không có vấn đề về reflection. Java Enum cũng là phương pháp tốt nhất được khuyên dùng để tạo ra một class đảm bảo thực sự là Singleton (only one instance at time).

3.3 Type safe.

Enum has there own name-space – Enum có name-space riêng của nó. Như ví dụ dưới đây, khi đã gán enum Company, không thể reassign lại giá trị của Enum.

public enum Company {
  EBAY, PAYPAL, GOOGLE, YAHOO, ATT
}

Company cName = Company.EBAY;
cName = 1;   // Compilation Error

Rõ ràng mà nói, khi sử dụng enum, những giá trị constant sẽ tuyệt đối an toàn, không như String hay int, giá trị có thể thay đổi liên tục.

3.4 Thead safety.

Một số trường hợp, khi enum custom, thật khó lòng chắc chắn rằng không có một thread nào khác ngoài thread khởi tạo có thể can thiệp vào Enum đã khởi tạo. Tuy nhiên:

An enum value is guaranteed to only be initialized once, ever, by a single thread, before it is used. However, methods that you add to an enum class do not carry any thread safety guarantee. If you have an enum so that the methods don’t change its state, then they are by definition thread safe.

Giá trị enum sẽ đảm bảo rằng nó chỉ được khởi tọa một lần duy nhất, tất nhiên, bởi duy nhất một thread, trước khi được sử dụng. Tuy nhiên, nếu enum có thêm vào các methods, thì không chắc có thể đảm bảo được itnsh thread safety. Nếu các methods không thay đổi state của chúng, enum chắc chắn sẽ là thread safe.

Một khi đảm bảo được các method trong enum không thay đổi trạng thái, khi lập trình luồng, enum sẽ luôn là lựa chọn hàng đầu. Bởi khi đã sử dụng, các lập trình viên sẽ tương đối yên tâm, tránh khỏi deadlock hoặc collision.

4. Kết luận.

Với những vấn đề đã phân tích phía trên, hẳn các bạn cũng đã hiểu tại sao nên sử dụng Enum. Khi nào thì nên sử dụng?. Hãy luôn cố gắng sử dụng enum để tạo ra code sạch, dễ cho người đọc hoặc sửa chữa sau này.

Việc sử dụng enum, ngoài việc tạo thói quen tốt, còn chứng tỏ rằng bạn nghiêm túc và sẵn sàng chịu trách nhiệm cho những dòng code mình viết ra.

Java Enum - sức mạnh khủng khiếp.
Từ C++ qua Java Enum đã trở thành một lực sĩ.

Nếu đã hiểu hết về Enum, tại sao lại không thử sức với bài Test Java của Upwork nhỉ?

5. Tài liệu tham khảo.

Again, thanks for reading, love u so much!

Có gì thắc mắc cứ comment đây nha! - Please feel free to comment here!

Kiên Nguyễn

👋 HEY THERE! 👋. My pleasure when you're here to read the article. Please feel free to comment, send a message or just want to say HELLO. Thank you, from bottom of my heart ❤️❤️❤️. Visit my portfolio: https://kieblog.com

Mời tui ly cà phê

Like page để không bỏ lỡ bài viết mới
Facebook Pagelike Widget
Bài viết mới
Lưu trữ