Il me semble que la classe booléenne est un candidat idéal pour être implémenté en tant qu'énumération.
En regardant le code source, la plupart de la classe est constituée de méthodes statiques qui pourraient être déplacées inchangées vers une énumération, le reste devenant beaucoup plus simple comme une énumération. Comparer l'original (commentaires et méthodes statiques supprimés):
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);
}
}
avec une version 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";
}
}
Y a-t-il une raison pour laquelle Boolean ne peut pas devenir un enum?
S'il s'agit du code Sun pour remplacer la méthode equals (), il manque une vérification très fondamentale de la comparaison des références des deux objets avant de comparer leurs valeurs. Voici comment je pense que la méthode equals () devrait être:
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}
if
) mais d'un point de vue conceptuel / théorie des types, les booléens et les énumérations sont tous les deux des types de somme, donc je pense qu'il est juste de demander pourquoi ils ne l'ont pas fait 't combler l'écart entre eux.
valueOf(String)
(qui serait en conflit avec la valeur de l'énumération) et la magie derrière getBoolean
qui peut faire en sorte que Boolean.valueOf("yes")
renvoie vrai plutôt que faux. Les deux font partie de la spécification 1.0 et nécessiteraient une compatibilité descendante appropriée.