1. Bối cảnh hình enum
thành
Hôm nay chúng ta sẽ khám phá một loại kiểu dữ liệu khác trong Java: enum
. Tên enum
xuất phát từ liệt kê từ . Loại dữ liệu này là gì và nó dùng để làm gì?
Đôi khi một lập trình viên cần tạo một kiểu dữ liệu mới, mà các giá trị có thể có của nó được giới hạn trong một danh sách cố định nhỏ.
Ví dụ: một DayOfTheWeek
loại chỉ có thể nhận các giá trị MONDAY
, TUESDAY
, WEDNESDAY
, ... Tổng cộng có 7 giá trị. Hoặc một Month
loại chỉ có thể nhận các giá trị JANUARY
, FEBRUARY
, MARCH
, ... Tổng cộng có 12 giá trị.
Tất nhiên, bạn sử dụng các số có thể ( int
loại): 1
— Thứ Hai, 2
— Thứ Ba, v.v. Nhưng ai đó có thể vô tình gán các giá trị không hợp lệ như 8
hoặc 0
cho biến của bạn.
Bạn có thể dễ dàng gặp tình huống trong đó một lập trình viên nghĩ rằng các ngày trong tuần (hoặc các tháng trong năm) được đánh số bắt đầu từ 0, trong khi những người khác lại mong đợi việc đánh số của họ bắt đầu từ một, v.v.
Đó là lý do tại sao Java đã giới thiệu enum
, một kiểu dữ liệu bao gồm một tập hợp hữu hạn các giá trị .
2. Khai báo kiểu
Khai báo một kiểu dữ liệu mới enum
trông như thế này:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Đâu TypeName
là tên của loại (lớp) mới và các giá trị có thể được phân tách bằng dấu phẩy và được bao trong dấu ngoặc nhọn: Value1
, Value2
, Value3
.
Ví dụ: hãy tạo của riêng chúng tôi DayOfTheWeek
enum
:
Mã số | Ghi chú |
---|---|
|
Day Loại mới Thứ hai Thứ ba Thứ tư Thứ năm Thứ sáu Thứ bảy Chủ nhật |
Đây là cách bạn gán một giá trị cho một biến kiểu mới của chúng ta:
Day day = Day.MONDAY;
Ví dụ:
Mã số | Ghi chú |
---|---|
|
Đầu ra màn hình sẽ là:
|
3. Phương pháp của mộtenum
Một enum
loại có một số phương thức tích hợp sẵn, hai trong số đó rất thú vị:
Phương thức tĩnh values()
trả về một mảng gồm tất cả các giá trị của enum
kiểu:
Mã số | Ghi chú |
---|---|
|
Biến days lưu một mảng chứa các giá trị của Day kiểu dữ liệu (7 phần tử) Hiển thị nội dung của mảng ra màn hình:
|
Phương ordinal()
thức trả về số thứ tự của hằng số. Bạn gọi nó trên một enum
giá trị chứ không phải là một enum
lớp:
Mã số | Đầu ra bảng điều khiển |
---|---|
|
|
4. Chuyển đổi thành một lớp
Trong thực tế, không có gì kỳ diệu ở đây. Trình biên dịch vừa cung cấp cho chúng tôi một số đường cú pháp. Tại thời điểm biên dịch, Day
enum được chuyển đổi thành một lớp thông thường:
Mã, phiên bản đơn giản hóa | Ghi chú |
---|---|
|
Day lớp Danh sách các hằng số tĩnh Một mảng chứa tất cả các giá trị của Day enum Một biến lưu trữ giá trị của một Day đối tượng cụ thể Lớp là riêng tư, có nghĩa là các đối tượng của Day lớp chỉ có thể được tạo bên trong lớp. Phương thức phải được gọi trên một đối tượng. Nó trả về giá trị của đối tượng — trường. Phương thức trả về một mảng tĩnh với tất cả các giá trị của lớpconstructor Day Day ordinal Day value Day |
Nếu chúng ta loại bỏ tất cả các phương thức và biến tĩnh khỏi Day
lớp, chúng ta sẽ nhận được như sau:
Mã số | Ghi chú |
---|---|
|
Biến value lưu trữ giá trị của Day đối Day tượng Các đối tượng chỉ có thể được tạo bên trong Day lớp, vì hàm tạo là private . Phương ordinal() thức trả về value đối Day tượng. |
Nói cách khác, không có gì đáng sợ đang xảy ra ở đây. Trình biên dịch tạo Day
lớp, thêm các hằng số đại diện cho enum
các giá trị, thêm các phương thức cần thiết và tạo hàm tạo của lớp private
. Chúng ta sẽ xem xét cách các hàm tạo hoạt động sau.
Hy vọng rằng bây giờ đã rõ tại sao chúng ta gán giá trị cho một biến theo cách này:
Day day = Day.MONDAY;
MONDAY
chỉ là một trường tĩnh (hằng số) trong Day
lớp. Khi truy cập các phương thức và trường tĩnh từ bên ngoài lớp, bạn phải chỉ ra tên lớp trước tên của trường hoặc phương thức.
5. Nhiều phương pháp của mộtenum
Mỗi enum
lớp có một số tính năng thú vị.
Chuyển đổi sang và từ một chuỗi
Để chuyển đổi một đối tượng enum thành một chuỗi, bạn cần gọi toString()
phương thức của nó.
String str = Day.MONDAY.toString();
Để chuyển đổi theo hướng khác (từ chuỗi thành Day
đối tượng), bạn có thể sử dụng valueOf()
phương thức tĩnh:
Day day = Day.valueOf("MONDAY");
Nó siêu tiện lợi và sẽ hữu ích trong nhiều trường hợp.
Chuyển đổi thành một số và ngược lại
Bạn đã biết cách chuyển đổi một enum
đối tượng thành một số: gọi ordinal()
phương thức:
int index = Day.MONDAY.ordinal();
Để chuyển đổi theo hướng khác (từ một số sang một Day
đối tượng), bạn cần một cấu trúc rõ ràng hơn:
Day day = Day.values()[2];
Ví dụ:
Mã số | Ghi chú |
---|---|
|
Thứ Hai Lấy chỉ số của Thứ Hai: 0 Ngày trong tuần 2 ngày sau Thứ Hai |
Điểm quan trọng: vì enum
các giá trị là một tập hợp các hằng số cố định nên chúng có thể được so sánh bằng cách sử dụng == . Nói cách khác, bạn không thể có hai MONDAY
đối tượng giống hệt nhau với địa chỉ khác nhau. Chỉ tồn tại một phiên bản duy nhất của mỗi giá trị enum. Và điều đó có nghĩa là việc so sánh các biến enum bằng == sẽ luôn hoạt động.
6. Thêm các phương thức của riêng bạn vào mộtenum
Bởi vì an enum
biến thành một lớp bình thường khi biên dịch, bạn có thể khai báo các phương thức trong đó. Các phương thức này chỉ đơn giản là được thêm vào lớp mà trình biên dịch tạo ra. Ví dụ: giả sử chúng tôi muốn Day enum
trả về một danh sách các giá trị enum thay vì một mảng.
Sau đó, chúng ta có thể thêm đoạn mã sau:
Mã số | Ghi chú |
---|---|
|
Dấu chấm phẩy là bắt buộc sau danh sách các giá trị. Tạo một ArrayList đối tượng Thêm các giá trị trong mảng mà values() phương thức trả về. Trả lại danh sách. |
Bây giờ phương thức này có thể được gọi bằng mã:
Mã số | Ghi chú |
---|---|
|
Biến list sẽ lưu trữ một danh sách tất cả các giá trị của Day enum . |
GO TO FULL VERSION