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

14380

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 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;
}
}

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.

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

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.

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:

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