Es scheint mir, dass die Boolesche Klasse ein idealer Kandidat ist, um als Aufzählung implementiert zu werden.
Mit Blick auf den Quellcode besteht der größte Teil der Klasse aus statischen Methoden, die unverändert in eine Aufzählung verschoben werden können. Der Rest wird als Aufzählung viel einfacher. Original vergleichen (Kommentare und statische Methoden entfernt):
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);
}
}
mit einer Enum-Version:
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";
}
}
Gibt es einen Grund, warum Boolean keine Aufzählung werden konnte?
Wenn dies der Sun-Code zum Überschreiben der equals () -Methode ist, fehlt eine sehr grundlegende Überprüfung des Vergleichs der Referenzen der beiden Objekte vor dem Vergleich ihrer Werte. So sollte meiner Meinung nach die equals () -Methode sein:
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}
if
) gibt, aber aus konzeptioneller / typentheoretischer Sicht sind Boolesche Werte und Aufzählungen beide Beispiele für Summentypen. Ich denke, es ist fair zu fragen, warum sie dies nicht getan haben Überbrücken Sie nicht die Lücke zwischen ihnen.
valueOf(String)
(was mit dem Wert der Aufzählung in Konflikt stehen würde) und die Magie, die dahinter steckt, verpasst zu haben, getBoolean
sodass Boolean.valueOf("yes")
true und nicht false zurückgegeben wird. Beide sind Teil der 1.0-Spezifikation und erfordern eine angemessene Abwärtskompatibilität.