Wydaje mi się, że klasa boolowska jest idealnym kandydatem do wdrożenia jako wyliczenie.
Patrząc na kod źródłowy, większość klas to metody statyczne, które można przenieść bez zmian do wyliczenia, reszta staje się znacznie prostsza jako wyliczenie. Porównaj oryginał (usunięte komentarze i metody statyczne):
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);
}
}
z wersją 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";
}
}
Czy jest jakiś powód, dla którego Boolean nie mógł zostać enum?
Jeśli jest to kod Sun zastępujący metodę equals (), brakuje bardzo podstawowej kontroli porównania referencji dwóch obiektów przed porównaniem ich wartości. Tak myślę, że metoda equals () powinna być:
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}
if
), ale z punktu widzenia teorii konceptualnej / typów logiczne i wyliczenia są zarówno typami sum, więc myślę, że sprawiedliwe jest pytanie, dlaczego nie wypełnić lukę między nimi.
valueOf(String)
(która kolidowałaby z wartością enum wyliczenia) i magię, getBoolean
która może sprawić, że będzie ona Boolean.valueOf("yes")
zwracać prawdę, a nie fałsz. Oba są częścią specyfikacji 1.0 i wymagałyby odpowiedniej kompatybilności wstecznej.