Enum trong Java

Enum trong java là một kiểu dữ liệu đặc biệt của Java được sử dụng để định nghĩa các tập hợp các hằng số. Cụ thể hơn, Java enum là một kiểu đặc biệt của lớp trong java. Một enum có thể chứa các trường, phương thức và Constructor.

Nó có thể được sử dụng để đị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), …

Java enum đã được thêm vào trong Java 5 cùng một số tính năng khác.

1. Enum trong java được định nghĩa ở đâu?

Enum trong java 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.

Ví dụ enum trong java: định nghĩa bên trong một lớp

package vn.viettuts.javaenum; public class EnumExample1 {    // define enum    enum Season {        SPRING, SUMMER, FALL, WINTER;    }     public static void main(String[] args) {        Season season = Season.WINTER;        System.out.println(season);    }}

Kết quả:

WINTER

Ví dụ enum trong java: định nghĩa bên ngoài một lớp

package vn.viettuts.javaenum; // define enumenum Season {    SPRING, SUMMER, FALL, WINTER;} public class EnumExample2 {    public static void main(String[] args) {        Season season = Season.WINTER;        System.out.println(season);    }}

Kết quả:

WINTER

Ví dụ enum trong java: định nghĩa trong một file riêng biệt

File Season.java

package vn.viettuts.javaenum; public enum Season {    SPRING, SUMMER, FALL, WINTER;}

File EnumExample3.java

package vn.viettuts.javaenum; public class EnumExample3 {    public static void main(String[] args) {        Season season = Season.WINTER;        System.out.println(season);    }}

Kết quả:

WINTER

2. Duyệt các phần tử trong enum

Dưới đây là ví dụ đơn giản về việc duyệt các phần tử enum trong java:

package vn.viettuts.javaenum; public class EnumExample4 {    // define enum Season    public enum Season {        SPRING, SUMMER, FALL, WINTER    }     public static void main(String[] args) {        // traverse enum Season        for (Season s : Season.values()) {            System.out.println(s);        }    }}

Kết quả:

SPRING
SUMMER
FALL
WINTER

Phương thức values() trong enum

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.

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

Ví dụ 1: về định nghĩa giá trị ban đầu cho hằng số enum:

package vn.viettuts.javaenum; public class EnumExample5 {    // define enum Season    enum Season {        SPRING(5), SUMMER(10), FALL(15), WINTER(20);         private int value;         private Season(int value) {            this.value = value;        }    }     public static void main(String args[]) {        for (Season s : Season.values()) {            System.out.println(s + " " + s.value);        }    }}

Kết quả:

SPRING 5
SUMMER 10
FALL 15
WINTER 20

Note: 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.

Ví dụ 2: về định nghĩa nhiều giá trị cho hằng số enum:

Tạo enum PageInfo với tên file PageInfo.java:

package vn.viettuts.javaenum; public enum PageInfo {    // define enum with 3 variable    PAGE_001("PAGE_001", "Login", "/login"),     PAGE_002("PAGE_002", "Add new user", "/addUser"),     PAGE_003("PAGE_003", "List user", "/listUser");         private String pageID;    private String pageTitle;    private String pageURL;         /**     * constructor     *      * @param pageID     * @param pageTitle     * @param pageURL     */    private PageInfo(String pageID, String pageTitle, String pageURL) {        this.pageID = pageID;        this.pageTitle = pageTitle;        this.pageURL = pageURL;    }         // getter & setter    public String getPageID() {        return pageID;    }     public void setPageID(String pageID) {        this.pageID = pageID;    }     public String getPageTitle() {        return pageTitle;    }     public void setPageTitle(String pageTitle) {        this.pageTitle = pageTitle;    }     public String getPageURL() {        return pageURL;    }     public void setPageURL(String pageURL) {        this.pageURL = pageURL;    }}

Tạo lớp Test.java để sử dụng enum đã tạo ở trên:

package vn.viettuts.javaenum; public class Test {    public static void main(String[] args) {        System.out.println("pageID: " + PageInfo.PAGE_001.getPageID());        System.out.println("pageTitle: " + PageInfo.PAGE_001.getPageTitle());        System.out.println("pageURL: " + PageInfo.PAGE_001.getPageURL());    }}

Kết quả:

pageID: PAGE_001
pageTitle: Login
pageURL: /login

4. Sử dụng java enum trong câu lệnh switch

Dưới đây là ví dụ về sử dụng java enum trong câu lệnh switch:

package vn.viettuts.javaenum; public class EnumExample5 {    // define days of week    enum Day {        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,         SATURDAY, SUNDAY    }     public static void main(String args[]) {        Day day = Day.SUNDAY;         switch (day) {        case SUNDAY:            System.out.println("sunday");            break;        case MONDAY:            System.out.println("monday");            break;        default:            System.out.println("other day");        }    }}

Kết quả:

sunday

5. So sánh các phần tử java enum

Bạn có thể sử dụng phương thức equals() hoặc toán tử ‘==’ để so sánh các phần tử enum, ví dụ:

package vn.viettuts.javaenum; public class EnumExample7 {    // define days of week    enum Day {        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,        SATURDAY, SUNDAY    }     public static void main(String args[]) {        Day day1 = Day.SUNDAY;        Day day2 = Day.MONDAY;        // use equal() method        if (day1.equals(Day.SUNDAY)) {            System.out.println("sunday");        }        // use '==' operator        if (day2 == Day.MONDAY) {            System.out.println("monday");        }    }}

Kết quả:

sunday
monday

6. Câu hỏi về enum trong java

Câu hỏi 1: Chúng ta có thể tạo ra thể hiện của enum bằng từ khoá new không?

Không, bởi vì nó chỉ có các Constructor private.

Câu hỏi 2: Chúng ta có thể khai báo phương thức trừu tượng trong enum không?

Có, chúng ta có thể có các phương thức trừu tượng và có thể cung cấp việc thực hiện các phương thức này.