Bài này sẽ giới thiệu đến các bạn kiểu dữ liệu enum trong Java. Chúng ta đã từng tìm hiểu Kiểu dữ liệu enum trong C++. Các bạn có thể đọc thêm để tham khảo nhé.
1. Kiểu dữ liệu enum trong Java là gì?
Trong Java, enum là một kiểu dữ liệu bao gồm tập hợp các các giá trị hằng không đổi (enum constant). Chúng ta sử dụng từ khóa enum để khai báo một kiểu dữ liệu enum. Ví dụ:
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
Trong ví dụ trên, chúng ta có 1 kiểu enum tên là Size. Nó bao gồm các giá trị không đổi là SMALL, MEDIUM, LARGE và EXTRALARGE trong dấu ngoặc nhọn {}. Các giá trị hằng không đổi thường được viết hoa.
Chúng ta có thể tạo một biến kiểu dữ liệu enum và sử dụng toán tử chấm (.) để truy xuất các giá trị không đổi thuộc kiểu dữ liệu enum.
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
class Main {
public static void main(String[] args) {
Size s1 = Size.LARGE;
Size s2 = Size.SMALL;
System.out.println(s1);
System.out.println(s2);
}
}
Kết quả
LARGE
SMALL
Lưu ý: Nếu sử dụng tên enum Size truy xuất giá trị hằng không tồn tại trong Size thì sẽ gây ra lỗi.
Size s3 = Size.SMALLEST;//error cannot find symbol variable SMALLEST
2. Enum class trong Java
Trong Java, kiểu dữ liệu enum có thể được xem như là một lớp đặc biệt. Một lớp enum có thể bao gồm những thuộc tính và phương thức giống như một lớp bình thường.
Khi chúng ta tạo một lớp enum thì trình biên dịch sẽ tự động tạo các đối tượng chính là các giá trị không đổi của enum. Tất cả các đối tượng này mặc định được trình biên dịch xác định khai báo là public static final. Ví dụ:
enum Size{
SMALL, MEDIUM, LARGE, EXTRALARGE;
public String getSize() {
switch(this) {
case SMALL:
return "small";
case MEDIUM:
return "medium";
case LARGE:
return "large";
case EXTRALARGE:
return "extra large";
default:
return null;
}
}
}
class Main{
public static void main(String[] args) {
//gọi hàm getSize() sử dụng đối tượng SMALL của enum Size
System.out.println("The size of the pizza is " + Size.SMALL.getSize());
}
}
Kết quả
The size of the pizza is small
Trong ví dụ trên, lớp enum Size được tạo ra. Lớp này tự động được trình biên dịch tạo ra có 4 đối tượng là SMALL, MEDIUM, LARGE và EXTRALARGE. Các đối tượng này có thể gọi hàm getSize()
thuộc lớp enum để sử dụng.
Các phương thức của lớp enum
Giả sử, chúng ta có lớp enum sau:
enum Size{
SMALL, MEDIUM, LARGE, EXTRALARGE;
public void displayInfo(){
System.out.println(SMALL + ", " + MEDIUM + ", " + LARGE + ", " + EXTRALARGE);
}
}
Trong Java, một số phương thức đã được định nghĩa sẵn trong lớp enum để sử dụng.
Hàm ordinal()
Trả về vị trí của giá trị không đổi trong enum.
Size s1 = Size.MEDIUM;
System.out.println(s1.ordinal());//1
Hàm compareTo()
Trả về kết quả so sánh vị trí của các giá trị không đổi trong enum.
System.out.println(Size.SMALL.compareTo(Size.MEDIUM));//-1
System.out.println(Size.EXTRALARGE.compareTo(Size.SMALL));//3
Hàm toString()
Trả về một chuỗi đại diện cho các giá trị không đổi trong enum.
System.out.println(Size.SMALL.toString());//SMALL
System.out.println(Size.EXTRALARGE.toString());//EXTRALARGE
Chúng ta có thể thay đổi chuỗi mặc định đại diện cho các enum constant.
enum Size {
SMALL {
//ghi đè hàm toString() cho enum constant SMALL
@Override
public String toString() {
return "The size is small.";
}
},
MEDIUM {
//ghi đè hàm toString() cho enum constant MEDIUM
@Override
public String toString() {
return "The size is medium.";
}
};
}
class Main {
public static void main(String[] args) {
System.out.println(Size.MEDIUM.toString());//The size is medium.
}
}
Hàm name()
Trả về tên được định nghĩa trong enum của các giá trị không đổi.
Size s1 = Size.MEDIUM;
System.out.println(s1.name());//MEDIUM
Hàm valueOf()
Trả về một chuỗi có cùng tên với các giá trị không đổi trong enum.
System.out.println(Size.valueOf("SMALL"));//SMALL
System.out.println(Size.valueOf("SMALLEST"));//lỗi no enum constant Size.SMALLEST
Hàm values()
Trả về một mảng chứa các giá trị không đổi trong enum.
Size[] enumArray = Size.values();
for(Size s:enumArray){
System.out.println(s);
/*Kết quả xuất ra là
SMALL
MEDIUM
LARGE
EXTRALARGE*/
}
3. Enum constructor trong Java
Trong Java, một lớp enum cũng có thể có hàm khởi tạo giống như một lớp bình thường. Có 2 loại hàm khởi tạo của một lớp enum:
- private chỉ được truy cập trong lớp enum
- mặc định (default) chỉ được truy cập trong package chứa lớp enum
Ví dụ:
enum Size {
//enum constants gọi hàm khởi tạo private
SMALL("The size is small."),
MEDIUM("The size is medium."),
LARGE("The size is large."),
EXTRALARGE("The size is extra large.");
private final String cakeSize;
//hàm khởi tạo private trong enum
private Size(String pizzaSize) {
this.cakeSize = pizzaSize;
}
public String getSize() {
return cakeSize;
}
}
class Main {
public static void main(String[] args) {
Size size = Size.SMALL;
System.out.println(size.getSize());
}
}
Kết quả
The size is small.
Trong ví dụ trên, hàm khởi tạo của lớp enum Size khai báo private nên chỉ được gọi trong lớp Size. Các hằng trong enum gọi hàm khởi tạo của lớp enum Size:
SMALL("The size is small."),
MEDIUM("The size is medium."),
LARGE("The size is large."),
EXTRALARGE("The size is extra large.");
Trong lớp Main, chúng ta gán Size.SMALL
cho một biến có kiểu enum Size. Hằng SMALL đã gọi hàm khởi tạo của Size.