ブールクラスは列挙型として実装するのに理想的な候補であるように思えます。
ソースコードを見ると、ほとんどのクラスは静的メソッドであり、変更せずに列挙型に移動できますが、残りは列挙型としてはるかに単純になります。オリジナルを比較(コメントと静的メソッドは削除):
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";
}
}
ブール値が列挙型になれない理由はありますか?
これがequals()メソッドをオーバーライドするSunコードである場合、2つのオブジェクトの参照を比較してから値を比較するという非常に基本的なチェックが欠落しています。これは、equals()メソッドが次のようになるべきだと思う方法です。
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}
if
)を処理するための特別なステートメントがありますが、概念/タイプ理論の観点から、ブール値と列挙型は両方とも合計タイプのインスタンスであるため、Javaでは無意味になります。それらの間のギャップを埋めないでください。
valueOf(String)
(enumのvalueOfと競合する)の実装と、偽ではなくtrue getBoolean
をBoolean.valueOf("yes")
返すようにすることができる魔法の実装を逃したように見えます。どちらも1.0仕様の一部であり、適切な後方互換性が必要です。