Chào các bạn đã đến với chủ đề tiếp theo của mình. Hôm nay, mình sẽ tiếp tục tìm hiểu về cách sử dụng Enum trong lập trình java. Ở bài này, mình sẽ đi qua những nội dung như sau:
Nội dung
- 1. Enum là gì?
- 2. Khai báo enum
- 3. Duyệt các phần tử trong enum
- 4. Khởi tạo giá trị đặc biệt cho hằng số enum
- 5. So sánh các phần tử java enum
- 6. Sử dụng enum trong câu lệnh switch
- 7. Ghi đè phương thức trong Enum
- 8. Phương thức trừu tượng (abstract method) trong Enum
- 9. Enum có thể implement một Interface
- 10. Kết
1. Enum là gì?
enum là một từ khóa trong Java, là một kiểu dữ liệu đặc biệt được sử dụng để đại diện cho hằng số cố định.
Một enum có thể chứa các trường, phương thức và constructor.
Bởi vì các giá trị của Enum là các hằng số, nên tên của các trường kiểu enum thường là các chữ cái hoa.
Trong ngôn ngữ lập trình Java, bạn xác định một kiểu enum bằng cách sử dụng từ khóa enum. Ví dụ, sử dụng enum để định nghĩa các ngày trong tuần (SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY), các mùa trong năm (SPRING, SUMMER, FALL, WINTER), …
2. Khai báo enum
Trong Java, enum có thể được định nghĩa bên trong hoặc bên ngoài một lớp, vì nó tương tự như lớp trong java.
2.1. Ví dụ enum định nghĩa bên trong một lớp
public class EnumExample {
enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
public static void main(String[] args) {
WeekDay d = WeekDay.MONDAY;
System.out.println(d);
}
}
Kết quả thực thi chương trình trên:
MONDAY
2.2. Ví dụ enum định nghĩa bên ngoài một lớp
enum WeekDay { // Không được khai báo access modifier (sử dụng default)
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
public class EnumExample {
public static void main(String[] args) {
WeekDay d = WeekDay.MONDAY;
System.out.println(d);
}
}
Kết quả thực thi chương trình trên:
MONDAY
Lưu ý: enum định nghĩa bên ngoài một lớp không thể dụng access modifier public, protected, private.
2.3. Ví dụ enum định nghĩa trong một file riêng biệt
WeekDay .java
public enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
EnumExample.java
public class EnumExample {
public static void main(String[] args) {
WeekDay d = WeekDay.MONDAY;
System.out.println(d);
}
}
Kết quả thực thi chương trình trên:
MONDAY
3. Duyệt các phần tử trong enum
Chúng ta có thể duyệt trên tất cả các phần tử của enum, thông qua method values().
Trình biên dịch trong java tự động thêm phương thức values() vào enum khi nó được biên dịch. Phương thức values() trả về một mảng chứa tất cả các giá trị của enum.
Ví dụ:
public class EnumExample {
enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
public static void main(String[] args) {
for (WeekDay d : WeekDay.values()) {
System.out.println(d);
}
}
}
Kết quả thực thi chương trình trên:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY
4. Khởi tạo giá trị đặc biệt cho hằng số enum
Các hằng số enum có giá trị ban đầu bắt đầu từ 0, 1, 2, 3, … Nhưng chúng ta có thể khởi tạo giá trị cụ thể cho các hằng số enum bằng cách định nghĩa các trường và các Constructor. Như đã giới thiệu, Enum có thể có các trường, phương thức và Constructor.
Constructor của enum trong java là private. Khi bạn không khai báo là private thì trình biên dịch sẽ tạo ra constructor private không có tham số.
Các phần tử trong enum luôn là static final.
Có thể viết một static method trong enum.
Ví dụ:
public class EnumExample3 {
enum WeekDay {
// Khởi tạo các phần tử từ construnctor
// Các phần tử này luôn là static final
MONDAY(2), TUESDAY(3), WEDNESDAY(4), THURSDAY(5), FRIDAY(7), SATURDAY(7), SUNDAY(1);
private int value;
// constructor này chỉ dùng trong nội bộ Enum
// Modifier của constructor enum luôn là private
// Nếu không khai báo private, java cũng sẽ hiểu là private.
WeekDay(int value) {
this.value = value;
}
// Có thể viết một static method lấy ra WeekDay theo value.
public static WeekDay getWeekDayByValue(int value) {
for (WeekDay d : WeekDay.values()) {
if (d.value == value) {
return d;
}
}
return null;
}
}
public static void main(String[] args) {
for (WeekDay d : WeekDay.values()) {
System.out.println(d + " = " + d.value);
}
// Sử dụng static method của enum
WeekDay d = WeekDay.getWeekDayByValue(3);
System.out.println("value 3 is " + d);
}
}
Kết quả thực thi chương trình trên:
MONDAY = 2
TUESDAY = 3
WEDNESDAY = 4
THURSDAY = 5
FRIDAY = 7
SATURDAY = 7
SUNDAY = 1
value 3 is TUESDAY
5. So sánh các phần tử java enum
Enum là một đối tượng tham chiếu giống như class, interface nhưng nó cũng có thể sử dụng toán tử == hoặc equals() để so sánh các phần tử enum.
public class EnumExample {
enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
public static void main(String[] args) {
WeekDay today = WeekDay.SUNDAY;
// use equal() method
if (today.equals(WeekDay.SUNDAY)) {
System.out.println("Today is holiday");
} else {
System.out.println("Today is working day");
}
// use == operator
if (today == WeekDay.SUNDAY) {
System.out.println("Today is holiday");
} else {
System.out.println("Today is working day");
}
}
}
Kết quả thực thi chương trình trên:
Today is holiday
Today is holiday
6. Sử dụng enum trong câu lệnh switch
Cũng giống với các kiểu dữ liệu nguyên thủy (int,float,..) Enum có thể sử dụng như một tham số trong câu lệnh switch.
public class EnumExample {
enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
public static void main(String[] args) {
WeekDay today = WeekDay.SUNDAY;
switch (today) {
case MONDAY:
System.out.println("Today is working day");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Today is holiday");
break;
default:
System.out.println(today);
}
}
}
Kết quả thực thi chương trình trên:
Today is holiday
7. Ghi đè phương thức trong Enum
Do enum cũng là một kiểu dữ liệu được kết thừa từ lớp Object, nên chúng ta có thể ghi đè method toString() của lớp Object.
Ví dụ:
public class EnumExample3 {
enum WeekDay {
MONDAY(2), TUESDAY(3), WEDNESDAY(4), THURSDAY(5), FRIDAY(7), SATURDAY(7), SUNDAY(1);
private int value;
WeekDay(int value) {
this.value = value;
}
@Override
public String toString() {
if (value == 1) { // other way: if (this == SUNDAY) {
return "Today is holiday";
} else {
return "Today is working day";
}
}
}
public static void main(String[] args) {
WeekDay today = WeekDay.SUNDAY;
System.out.println(today);
System.out.println(today.toString());
}
}
Kết quả thực thi chương trình trên:
Today is holiday
Today is holiday
8. Phương thức trừu tượng (abstract method) trong Enum
Ví dụ:
Color.java
public enum Color {
RED("red") {
@Override
public String getHexCode() {
return "#ff0000";
}
},
GREEN("green") {
@Override
public String getHexCode() {
return "#00ff00";
}
},
BLUE("blue") {
@Override
public String getHexCode() {
return "#0000ff";
}
};
private String name;
Color(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract String getHexCode();
}
EnumExample.java
public class EnumExample {
public static void main(String[] args) {
for (Color color : Color.values()) {
System.out.println(color.getName() + " = " + color.getHexCode());
}
}
}
Kết quả thực thi chương trình trên:
red = #ff0000
green = #00ff00
blue = #0000ff
9. Enum có thể implement một Interface
Ví dụ:
import java.util.Arrays;
interface Option {
int getValue();
String getLabel();
}
enum Gender implements Option {
MALE(1, "Male"), FEMALE(2, "Female");
private int value;
private String label;
private Gender(int value, String label) {
this.value = value;
this.label = label;
}
@Override
public int getValue() {
return value;
}
@Override
public String getLabel() {
return label;
}
}
enum Country implements Option {
VIETNAM(1, "Viet Nam"), ENGLAND(2, "England");
private int value;
private String label;
private Country(int value, String label) {
this.value = value;
this.label = label;
}
@Override
public int getValue() {
return value;
}
@Override
public String getLabel() {
return label;
}
}
public class EnumExample6 {
public static void main(String[] args) {
Option[] countries = Country.values();
Option[] genders = Gender.values();
System.out.println(Arrays.asList(countries));
System.out.println(Arrays.asList(genders));
}
}
Kết quả thực thi chương trình trên:
[VIETNAM, ENGLAND]
[MALE, FEMALE]
10. Kết
Như vậy chúng ta đã tìm hiểu xong cách sử dụng Enum trong lập trình java. Cảm ơn các bạn đã theo dõi bài viết của mình. Chúc các bạn thành công. Hẹn gặp lại các bạn ở những chủ đề tiếp theo.
Nguồn: