Có, giống như thể bạn đã tạo các thể hiện singleton cho mỗi giá trị trong enum:
public abstract class RoundingMode {
public static final RoundingMode HALF_UP = new RoundingMode ();
public static final RoundingMode HALF_EVEN = new RoundingMode ();
Private RoundingMode () {
// phạm vi riêng tư ngăn chặn bất kỳ kiểu con nào bên ngoài lớp này
}
}
Tuy nhiên , enum
cấu trúc mang lại cho bạn nhiều lợi ích khác nhau:
- Mỗi thể hiện toString () in tên được cung cấp trong mã.
- (Như đã đề cập trong một bài đăng khác,) một biến kiểu enum có thể được so sánh với các hằng số bằng cách sử dụng
switch-case
cấu trúc điều khiển.
- Tất cả các giá trị trong kiểu liệt kê có thể được truy vấn bằng cách sử dụng
values
trường được 'tạo' cho mỗi kiểu enum
- Dưới đây là một trong những so sánh nhận dạng wrt lớn: các giá trị enum tồn tại được tuần tự hóa mà không cần sao chép.
Việc đăng nhiều kỳ là một gotchya lớn. Nếu tôi sử dụng mã ở trên thay vì enum, đây là cách bình đẳng danh tính sẽ hoạt động:
RoundingMode gốc = RoundingMode.HALF_UP;
khẳng định (RoundingMode.HALF_UP == gốc); // vượt qua
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
ObjectOutputStream oos = new ObjectOutputStream (baos);
oos.writeObject (bản gốc);
oos.flush ();
ByteArrayInputStream bais = new ByteArrayInputStream (baos.toByteArray ());
ObjectInputStream ois = new ObjectInputStream (bais);
RoundingMode deserialized = (RoundingMode) ois.readObject ();
khẳng định (RoundingMode.HALF_UP == deserialized); // thất bại
khẳng định (RoundingMode.HALF_EVEN == deserialized); // thất bại
Bạn có thể giải quyết vấn đề này mà không cần enum, bằng cách sử dụng một kỹ thuật liên quan đến writeReplace
và readResolve
, (xem http: //java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html ) ...
Tôi đoán vấn đề là - Java không cho phép bạn sử dụng danh tính các giá trị enum để kiểm tra tính bình đẳng; đó là một thực hành được khuyến khích.