(Для целей этого вопроса давайте предположим, что кто-то намеренно не использует auto (un) бокс), либо потому, что он пишет код перед Java 1.5, либо потому, что кто-то считает, что autounboxing слишком упрощает создание NullPointerException
s.)
Взять, к примеру, Boolean
. Документация для конструктора Boolean(boolean)
гласит:
Примечание. Редко уместно использовать этот конструктор. Если только новый
требуется экземпляр, статическая фабрика valueOf(boolean)
обычно
лучший выбор. Это может дать значительно лучшее пространство и время
производительность.
У меня вопрос: зачем вам когда-либо хотеть получить новый экземпляр? Кажется, что все было бы проще, если бы такие конструкторы были частными. Например, если бы они были, вы могли бы написать это без опасности (даже если myBoolean
были null
):
if (myBoolean == Boolean.TRUE)
Было бы безопасно, потому что все true Booleans
были бы ссылками на Boolean.TRUE
, а все false Booleans
были бы ссылками на Boolean.FALSE
. Но поскольку конструкторы общедоступны, возможно, кто-то их использовал, а это значит, что вы должны написать это вместо:
if (Boolean.TRUE.equals(myBoolean))
Но на самом деле все становится плохо, когда вы хотите проверить два Booleans
на равенство. Примерно так:
if (myBooleanA == myBooleanB)
... становится таким:
if (
myBooleanA == myBooleanB ||
(myBooleanA != null && myBooleanA.equals(myBooleanB))
)
ОБНОВЛЕНИЕ: С выпуском Java 7, java.util.Objects делает возможной эту более простую конструкцию:
if (Objects.equals(myBooleanA, myBooleanB))
Я не могу думать ни о какой причине, чтобы иметь отдельные экземпляры этих объектов, что является более убедительным, чем отсутствие необходимости делать глупости выше. Что скажете вы?