Enum và tất cả các tính năng của nó - 1

"Chào, Amigo!"

"Chào, Amigo!"

"Tôi sẽ kể cho bạn nghe về một điều rất thú vị. Nó khá đơn giản, nhưng điều đó càng làm cho nó thú vị hơn. Nó được gọi là enum. Một enum là một kiểu xác định tập giá trị cụ thể mà một biến có thể có. Hãy cùng xem tại một ví dụ ngay lập tức:"

Định nghĩa của một lớp enum
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}
Sử dụng một enum
Direction direction = Direction.LEFT;

if (direction == Direction.LEFT)
 direction = Direction.RIGHT;
else
 direction = Direction.DOWN;

"Vì vậy, chúng tôi chỉ liệt kê một tập hợp các giá trị và đó là nó?"

"Có, chúng tôi khai báo một enum và liệt kê tất cả các giá trị có thể có của nó bên trong, được phân tách bằng dấu phẩy."

"Nó cũng khá dễ sử dụng."

"Bạn có thể đặt nó thành null không?"

"Vâng, một enum là một lớp thông thường, hay đúng hơn là nó giống như một lớp, tương tự như cách các giao diện giống như các lớp."

"Vì vậy, bất cứ nơi nào tôi có thể sử dụng các lớp, tôi có thể sử dụng enum không?"

"Đúng."

"Tôi có thể khai báo một enum bên trong một lớp không?"

"Đúng."

"Và kế thừa một enum?"

"Không, bạn không thể kế thừa một enum và một enum không thể kế thừa các lớp khác."

"Tại sao vậy?"

"Bởi vì trình biên dịch Java chuyển đổi enum thành khoảng này:

public final class Direction extends Enum
{
 public static final Direction UP = new Direction();
 public static final Direction DOWN = new Direction();
 public static final Direction LEFT = new Direction();
 public static final Direction RIGHT = new Direction();

 private Direction() {} // Private constructor
}

"Như bạn có thể thấy từ ví dụ này:"

1) Lớp Direction hoàn toàn kế thừa lớp Enum, vì vậy nó không thể kế thừa bất kỳ thứ gì khác.

2) Lớp Direction được khai báo là cuối cùng, vì vậy không gì khác có thể kế thừa nó.

3) Các biến của lớp Direction thực sự là các biến Direction cuối cùng tĩnh công khai. Điều này thể hiện rõ trong mã sử dụng chúng:

Hướng hướng = Hướng .LEFT ;

4) Lớp Direction chỉ chứa một hàm tạo và nó là riêng tư. Điều đó có nghĩa là các đối tượng Hướng chỉ có thể được tạo bằng mã bên trong lớp. Ngoài các đối tượng được khai báo, không có đối tượng nào có thể được tạo.

5) Các biến hướng có thể được gán tham chiếu cho bất kỳ đối tượng Hướng nào hiện có. Tất cả chúng đều được đặt trong enum. Không có đối tượng nào khác thuộc loại này và sẽ không có bất kỳ đối tượng nào khác trong tương lai.

6) Các đối tượng hướng có thể được so sánh bằng cách sử dụng «==», sẽ chỉ thực hiện so sánh tham chiếu đơn giản."

"Tôi sẽ không nói nó quá rõ ràng, nhưng nó rõ ràng hơn nhiều sau ví dụ của bạn."

"Tuyệt. Sau đây là một số thông tin bổ sung dành cho bạn:"

1) Mỗi ​​đối tượng Hướng có một số duy nhất của riêng nó. Số đầu tiên (LÊN) là 0, số thứ hai (XUỐNG) là 1, số thứ ba (TRÁI) là 2, v.v. Bạn có thể lấy số này bằng phương thức ordinal(). "Nhìn vào màn hình:

Direction direction = Direction.LEFT;
int index = direction.ordinal();
int index2 = Direction.RIGHT.ordinal();

2) Mỗi ​​enum có một phương thức values () trả về một mảng các giá trị của enum.

int leftIndex = Direction.LEFT.ordinal();

Direction[] array = Direction.values();
Direction left = array[leftIndex];

"Điều này có nghĩa là chúng tôi có thể lấy chỉ mục của bất kỳ phần tử enum nào, sau đó lấy lại phần tử đó bằng cách sử dụng chỉ mục đó."

"Chúng ta cũng có thể sử dụng enum trong vòng lặp foreach :"

for (Direction direction : Direction.values())
{
 System.out.println(direction);
}
Đầu ra màn hình:
UP
DOWN
LEFT
RIGHT

"Điều đó có nghĩa là enum sẽ ghi đè phương thức toString? Rốt cuộc, nó không hiển thị bất cứ thứ gì như:"
«com.codegym.Direction@123fd4»?

"Có. Hơn nữa, mỗi enum, và do đó, Hướng, có thể được chuyển đổi thành Chuỗi và ngược lại."

Chuyển đổi thành Chuỗi:
String left = Direction.LEFT.toString(); // left == "LEFT";
Chuyển đổi một chuỗi thành một enum:
Direction direction = Direction.valueOf("LEFT");

"Ô! Tôi hiểu rôi."

"Điều gì xảy ra nếu bạn chuyển một Chuỗi tới hàm valueOf không theo Hướng? Ví dụ: «AMIGO»?"

"Bạn nghĩ sao?"

"Một ngoại lệ?"

"Yep. Một IllegalArgumentException."

"Chà, thế là kết thúc phần giới thiệu của chúng ta về thế giới enums."