Dường như với tôi rằng lớp Boolean là một ứng cử viên lý tưởng để được thực hiện như một enum.
Nhìn vào mã nguồn, hầu hết các lớp là các phương thức tĩnh có thể được chuyển không đổi sang một enum, phần còn lại trở nên đơn giản hơn nhiều như một enum. So sánh bản gốc (bình luận và phương thức tĩnh được loại bỏ):
public final class Boolean implements java.io.Serializable,
Comparable<Boolean>
{
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
private final boolean value;
public Boolean(boolean value) {
this.value = value;
}
public Boolean(String s) {
this(toBoolean(s));
}
public boolean booleanValue() {
return value;
}
public String toString() {
return value ? "true" : "false";
}
public int hashCode() {
return value ? 1231 : 1237;
}
public boolean equals(Object obj) {
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}
public int compareTo(Boolean b) {
return compare(this.value, b.value);
}
}
với phiên bản enum:
public enum Boolean implements Comparable<Boolean>
{
FALSE(false), TRUE(true);
private Boolean(boolean value) {
this.value = value;
}
private final boolean value;
public boolean booleanValue() {
return value;
}
public String toString() {
return value ? "true" : "false";
}
}
Có bất kỳ lý do tại sao Boolean không thể trở thành một enum?
Nếu đây là mã Sun để ghi đè phương thức equals (), thì nó thiếu một kiểm tra rất cơ bản để so sánh các tham chiếu của hai đối tượng trước khi so sánh các giá trị của chúng. Đây là cách tôi nghĩ phương thức equals () nên:
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}
if
) nhưng từ quan điểm lý thuyết / loại quan điểm của booleans và enums đều là các trường hợp của các kiểu tổng, vì vậy tôi nghĩ thật công bằng khi hỏi tại sao chúng không 't thu hẹp khoảng cách giữa họ.
valueOf(String)
(điều này sẽ mâu thuẫn với valueOf của enum) và phép thuật đằng sau getBoolean
có thể khiến nó Boolean.valueOf("yes")
trả về đúng chứ không phải sai. Cả hai đều là một phần của thông số 1.0 và sẽ cần khả năng tương thích ngược thích hợp.