Мне кажется, что булев класс является идеальным кандидатом для реализации в качестве перечисления.
Глядя на исходный код, большая часть класса - это статические методы, которые можно перемещать без изменений в перечисление, остальные становятся намного проще, чем перечисление. Сравните оригинал (комментарии и статические методы удалены):
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);
}
}
с версией 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";
}
}
Есть ли какая-то причина, почему Boolean не может стать перечислением?
Если это код Sun, переопределяющий метод equals (), он пропускает очень фундаментальную проверку сравнения ссылок двух объектов перед сравнением их значений. Вот как я думаю, что метод 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)
(которая будет конфликтовать со значением перечисления) и магию, getBoolean
которая может сделать его так, чтобы он Boolean.valueOf("yes")
возвращал значение true, а не false. Оба из них являются частью спецификации 1.0 и требуют соответствующей обратной совместимости.