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

13727

Bài viết được sự cho phép của tác giả Kiên Nguyễn

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.

  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java
  Kiểu Enum trong C/C++ (Code ví dụ Enumeration trong C/C++)

Xem thêm các việc làm Java lương cao trên TopDev

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. =)))

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.

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ánxử lí dữ liệu hoặc là Printable, Reportable).

>>> Xem thêm: Stream trong Java 8 là gì?

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.

Java Enum

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.
java enum
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ề reflectionJava 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).

>>> Xem thêm: Các phần mềm giả lập Java dành cho máy tính tốt nhất

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.

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.

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev