在我看来,布尔类是作为枚举实现的理想候选者。
从源代码来看,大多数类都是静态方法,可以将其不变地移至枚举,其余的则变得像枚举一样简单。比较原始(删除注释和静态方法):
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);
}
}
带有枚举版本:
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";
}
}
有什么理由使Boolean不能成为枚举?
如果这是要覆盖equals()方法的Sun代码,则它缺少在比较两个对象的引用之前比较它们的值的非常根本的检查。这就是我认为equals()方法应为的方式:
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}
if
)的专门语句,但是从概念/类型理论的角度来看,布尔值和枚举都是求和类型的实例,因此我想问一下为什么它们没有不能弥合他们之间的鸿沟。
valueOf(String)
(会与枚举的valueOf冲突)的实现及其背后的魔力getBoolean
,从而使它Boolean.valueOf("yes")
返回true而不是false。两者都是1.0规范的一部分,因此需要适当的向后兼容性。