Java - Enum Constructor

Xin chào các bạn, những phù thủy Java tương lai! Hôm nay, chúng ta sẽ bắt đầu hành trình thú vị vào thế giới của Enum trong Java và các constructor của chúng. Đừng lo nếu bạn mới bắt đầu học lập trình; tôi sẽ hướng dẫn bạn qua cuộc phiêu lưu này bước به bước, như cách tôi đã làm cho hàng ngàn học viên trong những năm dạy học. Vậy hãy lấy ly đồ uống yêu thích của bạn, thoải mái ngồi xuống và hãy bắt đầu!

Java - Enum Constructor

Enum là gì?

Trước khi nói về các constructor của Enum, hãy hiểu đầu tiên Enum là gì. Hãy tưởng tượng Enum (viết tắt của enumeration) như một loại lớp đặc biệt đại diện cho một nhóm các hằng số. Nó giống như một danh sách các giá trị được xác định trước.

Hãy tưởng tượng bạn đang tạo ra một trò chơi với các mức độ khó khác nhau. Bạn có thể sử dụng Enum để đại diện cho các mức độ này:

public enum DifficultyLevel {
EASY,
MEDIUM,
HARD
}

Ở đây, EASY, MEDIUM, và HARD là các hằng số (hoặc thành viên) của Enum DifficultyLevel của chúng ta.

Hiểu về Các Constructor của Enum

Bây giờ khi chúng ta biết Enum là gì, hãy nói về các constructor của nó. Giống như các lớp bình thường, Enum cũng có thể có các constructor! Các constructor này cho phép chúng ta liên kết dữ liệu bổ sung với mỗi hằng số Enum.

Constructor Enum Cơ Bản

Hãy cải thiện Enum DifficultyLevel của chúng ta bằng cách thêm mô tả cho mỗi mức độ:

public enum DifficultyLevel {
EASY("Đối với người mới bắt đầu"),
MEDIUM("Đối với người chơi trung cấp"),
HARD("Đối với người chơi cao thủ");

private final String description;

DifficultyLevel(String description) {
this.description = description;
}

public String getDescription() {
return description;
}
}

Trong ví dụ này:

  1. Chúng ta đã thêm một tham số String cho mỗi hằng số Enum.
  2. Chúng ta đã tạo ra một trường description private.
  3. Chúng ta đã định nghĩa một constructor nhận một tham số String và gán nó cho description.
  4. Chúng ta đã thêm một phương thức getter để truy cập mô tả.

Bây giờ, hãy xem cách chúng ta có thể sử dụng Enum này:

public class Game {
public static void main(String[] args) {
DifficultyLevel level = DifficultyLevel.MEDIUM;
System.out.println("Mức độ khó đã chọn: " + level);
System.out.println("Mô tả: " + level.getDescription());
}
}

Output:

Mức độ khó đã chọn: MEDIUM
Mô tả: Đối với người chơi trung cấp

Có phải điều này rất thú vị không? Chúng ta đã thêm thông tin bổ sung vào các hằng số Enum của mình!

Sử Dụng của Constructor Enum

Các constructor Enum rất hữu ích khi bạn muốn liên kết dữ liệu với mỗi hằng số Enum. Dưới đây là một số trường hợp sử dụng phổ biến:

  1. Thêm mô tả: Như chúng ta đã thấy trong ví dụ DifficultyLevel.
  2. Gán các giá trị số: Hữu ích cho việc sắp xếp hoặc tính toán.
  3. Liên kết với các đối tượng khác: Bạn có thể liên kết mỗi hằng số Enum với một thể hiện của một lớp khác.

Hãy xem một ví dụ khác nơi chúng ta gán các giá trị số cho các hằng số Enum của mình:

public enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS(4.869e+24, 6.0518e6),
EARTH(5.976e+24, 6.37814e6);

private final double mass;   // trong đơn vị kilogram
private final double radius; // trong đơn vị mét

Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}

public double getMass() { return mass; }
public double getRadius() { return radius; }

// Hằng số định nghĩa lực tương tác toàn vũ trụ (m3 kg-1 s-2)
public static final double G = 6.67300E-11;

public double surfaceGravity() {
return G * mass / (radius * radius);
}
}

Trong ví dụ này, chúng ta đã tạo ra một Enum Planet nơi mỗi hằng số có một khối lượng và bán kính. Bây giờ chúng ta có thể tính toán lực tương tác mặt trời của mỗi hành tinh:

public class SolarSystem {
public static void main(String[] args) {
for (Planet p : Planet.values()) {
System.out.printf("Lực tương tác mặt trời trên %s là %.2f m/s²%n",
p, p.surfaceGravity());
}
}
}

Output:

Lực tương tác mặt trời trên MERCURY là 3.70 m/s²
Lực tương tác mặt trời trên VENUS là 8.87 m/s²
Lực tương tác mặt trời trên EARTH là 9.80 m/s²

Phạm Vi của Constructor Enum

Bây giờ, hãy nói về phạm vi của các constructor Enum. Dưới đây là một điểm chính cần ghi nhớ:

Các constructor Enum luôn là private, ngay cả khi bạn không khai báo chúng như vậy.

Điều này có nghĩa là bạn không thể tạo các thể hiện mới của loại Enum bên ngoài định nghĩa Enum. Java làm điều này để đảm bảo rằng tập hợp các hằng số trong Enum là cố định và không thể thay đổi vào thời gian chạy.

Enum với Constructor Private

Mặc dù các constructor Enum luôn là private, điều này là một thực hành tốt để khai báo chúng như private rõ ràng:

public enum Season {
SPRING("Mild"),
SUMMER("Hot"),
AUTUMN("Cool"),
WINTER("Cold");

private final String temperature;

private Season(String temperature) {
this.temperature = temperature;
}

public String getTemperature() {
return temperature;
}
}

Enum với Constructor Package-private

Mặc dù các constructor Enum không thể là public, chúng có thể là package-private (bộ phận truy cập mặc định). Điều này cho phép các lớp khác trong cùng một gói có thể thấy constructor:

enum DatabaseConnection {
INSTANCE;

DatabaseConnection() {
// Khởi tạo kết nối cơ sở dữ liệu
}

void connect() {
System.out.println("Đã kết nối cơ sở dữ liệu");
}
}

Trong ví dụ này, chúng ta đang sử dụng Enum để triển khai mẫu đơn trong Singleton cho kết nối cơ sở dữ liệu.

Kết Luận

Xin chúc mừng! Bạn vừa mở khóa sức mạnh của các constructor Enum trong Java. Hãy nhớ rằng Enums không chỉ là các danh sách hằng số đơn giản; với các constructor, chúng trở thành công cụ mạnh mẽ để tạo ra các đối tượng an toàn về kiểu, dữ liệu phong phú.

Khi bạn tiếp tục hành trình Java của mình, bạn sẽ tìm thấy nhiều tính năng thú vị khác để khám phá. Hãy tiếp tục lập trình, học hỏi và quan trọng nhất, hãy thích thú! Ai biết, có lẽ một ngày nào đó bạn sẽ là người dạy Java cho thế hệ lập trình viên tiếp theo.

Trước khi kết thúc, hãy tóm tắt các phương thức chính có sẵn cho tất cả các loại Enum:

Phương thức Mô tả
values() Trả về một mảng chứa tất cả các hằng số enum
valueOf(String name) Trả về hằng số enum có tên được chỉ định
name() Trả về tên của hằng số enum này, chính xác như được tuyên bố
ordinal() Trả về thứ tự của hằng số enum này (vị trí trong định nghĩa enum, nơi hằng số ban đầu được gán thứ tự không)
compareTo(E o) So sánh enum này với đối tượng được chỉ định để đặt thứ tự
equals(Object other) Trả về true nếu đối tượng được chỉ định bằng hằng số enum này
hashCode() Trả về một mã băm cho hằng số enum này

Hãy nhớ, thực hành là chìa khóa để thành thạo. Vậy hãy bắt đầu tạo ra các Enum của riêng bạn, thử nghiệm các constructor và xem bạn có thể xây dựng ra những điều gì thú vị. Chúc bạn có một cuộc hành trình lập trình thú vị!

Credits: Image by storyset