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 clonephương pháp trong EnumĐảm bảo rằng enumhằ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 enumloại tồn tại ngoài những trường hợp được xác định bởi các enumhằng số.
Do chỉ có một thể hiện của mỗi enumhằng số, nên cho phép sử dụng ==toán tử thay cho equalsphươ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 enumhằng số . ( equalsPhương thức trong Enumlà một finalphươ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à equalsgì?
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 enumlà:
- 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.