Tự định nghĩa enum trong java

Giả sử chúng ta tạo ra một Person class trong đó có thuộc tính gender có giá trị là nam, nữ, khác. Loay hoay một hồi không biết là gender trong Person có type là gì đây ta!

À ha, gender là số nguyên, với giá trị 1 là nam, -1 là nữ, 0 là khác!

public class Person {
    // ...
    // 1: nam, -1 nu, 0 khac
    int gender;
}

Nhìn vào Person có vẽ khá rõ nghĩa. Giả sử mình là một dev mới vào, được giao nhiệm vụ implement một class mới tên là Statistic trong đó có hàm checkAndShowGender(Person person), hàm này sẽ nhận Person và kiểm tra in ra màn hình giới tính của person truyền vào. Và mình chưa hề đụng đến class Person.

public class Statistic {
    public void checkGenderAndShow(Person person) {
        if (person.gender == 1) {
            // what is gender?
        }
    }
}

À ha, tại sao gender lại là số nguyên? rồi giá trị 1 ứng với gì? Lúc này các bạn phải đi thẳng vào class Person mà coi thôi. Rõ ràng, nếu làm như vậy thì sẽ khiến cho code trở nên khó đọc hơn rất nhiều phải không!

Vậy thì Java đã giải quyết vấn đề trên với enum cho phép chúng ra định nghĩa một tập các hằng số. Mỗi hằng số này sẽ đại diện cho một giá trị nhất định. Điểm tuyệt vời ở đây là những hằng số có tên rõ ràng, đọc vào là hiểu ngay ý nghĩa của nó.

Để định nghĩa một enum trong java chúng ta làm như sau:

public enum Gender {
    MALE,
    FEMALE,
    OHTER
}

Gán giá trị cho enum

Chúng ta sẽ có class Person được viết lại như sau

public class Person {
    // ...
    Gender gender;
}

Để gán giá trị cho enum type chúng ta làm như sau:

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.gender = Gender.MALE
    }

}

So sánh enum trong java

Để so sánh enum trong java chúng ta dùng toán tử ‘==’ để so sánh

public class Statistic {
    public void checkGenderAndShow(Person person) {
        if (person.gender == Gender.MALE) {
            System.out.println("Nam");
        } else if (person.gender == Gender.FEMALE) {
            System.out.println("Nu");
        } else {
            System.out.println("Khac");
        }
    }
}

Hoặc dùng equals()

import java.util.ArrayList;

public class Statistic {
    public static void checkGenderAndShow(Person person) {
        if (person.gender.equals(Gender.MALE)) {
            System.out.println("Nam");
        } else if (person.gender.equals(Gender.FEMALE)) {
            System.out.println("Nu");
        } else {
            System.out.println("Khac");
        }
    }
}

Note: Khi sử dụng equals() có một điểm lưu ý, nếu giá trị enum chứa trong object là null thì chúng ta sẽ nhận NullpointerException đó nhé. 

public class Main {

    public static void main(String[] args) {
        Person person = new Person();
        person.gender = null;
        if (person.gender.equals(Gender.MALE)) {
            System.out.println("ok");
        } else {
            System.out.println("ko");
        }
    }
}

Output: Exception in thread “main” java.lang.NullPointerException

Để tránh trường hợp trên, chúng ta chỉ cần đổi vị trí so sánh cho nhau. Giá trị enum trong object nằm trong equals().

public class Main {

    public static void main(String[] args) {
        Person person = new Person();
        person.gender = null;
        if (Gender.MALE.equals(person.gender)) {
            System.out.println("ok");
        } else {
            System.out.println("ko");
        }
    }
}

Output: ko

Enum với Switch-Case

Theo cá nhân mình thấy kiểu như thằng enum này xin ra để dùng chung với switch-case các bạn ạ. Chúng ta sẽ đi đến ví dụ luôn. Mình sẽ tay if else ở trên bằng switch case. Trong code bên dưới có vẽ dễ chịu hơn code ở trên của mình!

public class Statistic {
    public static void checkGenderAndShow(Person person) {
        switch (person.gender) {
            case MALE:{
                System.out.println("Nam");
            } case FEMALE: {
                System.out.println("Nu");
            } case OHTER: {
                System.out.println("Khac");
            }
            default:break;
        }
    }
}

Enum Instance field

enum Gender {
    MALE("M"),
    FEMALE("F"),
    OHTER("O");

    private final String shortCode;

    Gender(String code) {
        this.shortCode = code;
    }

    public String getShortCode() {
        return this.shortCode;
    }
}

public class EnumDemo {
    public static void main(String[] args) {
        Gender gender1 = Gender.OHTER;
        System.out.println(gender1.getShortCode());
        Gender gender2 = Gender.MALE;
        System.out.println(gender2.getShortCode());
    }
}

Output:

O

M

Với mỗi hằng số trong enum chúng ta có thể định nghĩa được giá trị riêng của nó. Khi chúng ta thực hiện Gender gender1 = Gender.OHTER, lúc đó chương trình sẽ thực thi constructor của Gender enum và gán giá trị cho shortCode.

Note

Khi định nghĩa một enum, các hằng số phải được đặt đầu tiên.

Khi Enum có thêm instance filed và method, các hằng số phải kết thúc bằng dấu “;”. 

5 1 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x