Có thể ==
được sử dụng trên enum
?
Có: enums có các điều khiển cá thể chặt chẽ cho phép bạn sử dụng ==
để so sánh các thể hiện. Đây là sự đảm bảo được cung cấp bởi đặc tả ngôn ngữ (nhấn mạnh bởi tôi):
Một loại enum không có trường hợp nào khác ngoài các trường hợp được xác định bởi hằng số enum của nó.
Đó là một lỗi thời gian biên dịch để cố gắng khởi tạo một cách rõ ràng một kiểu enum. Các final clone
phương pháp trong Enum
Đảm bảo rằng enum
hằng không bao giờ có thể được nhân bản vô tính, và điều trị đặc biệt bởi cơ chế này để thỏa mãn serialization rằng trường hợp trùng lặp không bao giờ được tạo ra như là một kết quả của deserialization. Phản xạ tức thời của các loại enum bị cấm. Cùng với nhau, bốn điều này đảm bảo rằng không có trường hợp nào thuộc enum
loại tồn tại ngoài những trường hợp được xác định bởi các enum
hằng số.
Do chỉ có một thể hiện của mỗi enum
hằng số, nên cho phép sử dụng ==
toán tử thay cho equals
phương thức khi so sánh hai tham chiếu đối tượng nếu biết rằng ít nhất một trong số chúng tham chiếu đến enum
hằng số . ( equals
Phương thức trong Enum
là một final
phương thức chỉ đơn thuần gọi ra super.equals
đối số của nó và trả về kết quả, do đó thực hiện so sánh danh tính.)
Bảo đảm này đủ mạnh để Josh Bloch khuyến nghị, rằng nếu bạn khăng khăng sử dụng mẫu đơn, cách tốt nhất để thực hiện là sử dụng một phần tử duy nhất enum
(xem: Phiên bản Java 2 hiệu quả, Mục 3: Thi hành thuộc tính singleton với nhà xây dựng riêng hoặc một loại enum , cũng an toàn chủ đề trong Singleton )
Sự khác biệt giữa ==
và là equals
gì?
Xin nhắc lại, cần phải nói rằng nói chung, ==
KHÔNG phải là sự thay thế khả thi equals
. Tuy nhiên, khi đó (chẳng hạn như với enum
), có hai sự khác biệt quan trọng cần xem xét:
==
không bao giờ ném NullPointerException
enum Color { BLACK, WHITE };
Color nothing = null;
if (nothing == Color.BLACK); // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException
==
có thể kiểm tra tính tương thích tại thời điểm biên dịch
enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };
if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT); // DOESN'T COMPILE!!! Incompatible types!
Có nên ==
dùng khi áp dụng?
Bloch đặc biệt đề cập rằng các lớp bất biến có quyền kiểm soát thích hợp đối với các thể hiện của họ có thể đảm bảo cho khách hàng của họ ==
có thể sử dụng được. enum
được đề cập cụ thể để minh họa.
Mục 1: Xem xét các phương thức nhà máy tĩnh thay vì các nhà xây dựng
[...] nó cho phép một lớp bất biến đưa ra sự đảm bảo rằng không có hai trường hợp bằng nhau tồn tại: a.equals(b)
if và only if a==b
. Nếu một lớp thực hiện đảm bảo này, thì các máy khách của nó có thể sử dụng ==
toán tử thay vì equals(Object)
phương thức, điều này có thể dẫn đến hiệu suất được cải thiện. Các loại Enum cung cấp đảm bảo này.
Để tóm tắt, các đối số để sử dụng ==
trên enum
là:
- Nó hoạt động.
- Nó nhanh hơn.
- Nó an toàn hơn vào thời gian chạy.
- Nó an toàn hơn vào thời gian biên dịch.