Почему можно было бы хотеть использовать общедоступных конструкторов на булевской переменной и подобных неизменных классах?

(В целях этого вопроса давайте предположим, что каждый намеренно не использует автоматический (ООН) упаковка, или потому что каждый пишет предварительному Java 1,5 кода, или потому что каждый чувствует, что автораспаковывание делает слишком легким создать NullPointerExceptions.)

Взять Boolean, например. Документация для Boolean(boolean) конструктор говорит:

Примечание: Редко уместно использовать этого конструктора. Если новый экземпляр не требуется, статическая фабрика valueOf(boolean) обычно лучший выбор. Это, вероятно, приведет к значительно лучшей производительности пространства и времени.

Мой вопрос, почему Вы когда-либо хотели бы получить новый экземпляр во-первых? Кажется, что вещи были бы более простыми, если бы конструкторы как этот были частными. Например, если бы они были, то Вы могли бы записать это без опасности (даже если myBoolean были null):

if (myBoolean == Boolean.TRUE)

Это было бы безопасно потому что все верные Booleans были бы ссылки на Boolean.TRUE и вся ложь Booleans были бы ссылки на Boolean.FALSE. Но потому что конструкторы общедоступны, кто-то, возможно, использовал их, что означает, что необходимо записать это вместо этого:

if (Boolean.TRUE.equals(myBoolean))

Но то, где это действительно становится плохим, - когда Вы хотите проверить два Booleans для равенства. Что-то вроде этого:

if (myBooleanA == myBooleanB)

... становится этим:

if (
    myBooleanA == myBooleanB ||
    (myBooleanA != null && myBooleanA.equals(myBooleanB))
)

ОБНОВЛЕНИЕ: С выпуском Java 7, java.util. Объекты делают эту более простую конструкцию возможной:

if (Objects.equals(myBooleanA, myBooleanB))

Я не могу думать ни о какой причине иметь отдельные экземпляры этих объектов, который более востребован, чем не необходимость сделать ерунду выше. Что говорит Вас?

5
задан Robert J. Walker 1 August 2013 в 22:01
поделиться

3 ответа

Кэшированные значения никогда не собираются сборщиком мусора, поэтому используйте конструкторы всякий раз, когда вы хотите использовать их как мягкие / слабые ссылки, чтобы они могли быть мусором. собираются в любом случае, когда это необходимо. То же самое применимо к Long # valueOf () , Integer # valueOf () и согласуется со значениями в пределах кэшируемых диапазонов.

Выполняя справочный поиск в Eclipse, я узнал, что под каждым java.lang.Thread использует new Boolean () в качестве кэша на основе мягких ссылок, он даже явно прокомментирован (в isCCLOverridden () метод):

/*
 * Note: only new Boolean instances (i.e., not Boolean.TRUE or
 * Boolean.FALSE) must be used as cache values, otherwise cache
 * entry will pin associated class.
 */
5
ответ дан 14 December 2019 в 19:08
поделиться

Конструкторы являются общедоступными из-за обратной совместимости ... .valueOf () был добавлен только в java 1.4 ...

Также используется логическое значение в качестве переменная с тремя состояниями в вашем примере (null / TRUE / FALSE), вероятно, является плохой идеей - лучше использовать перечисление (UNKNOWN, TRUE, FALSE), или, если null не является допустимым значением, проверьте его и вручную распаковать для проверки равенства.

1
ответ дан 14 December 2019 в 19:08
поделиться

Эти типы объектов были необходимы, потому что класс Collection принимал только объекты, поэтому вы не могли использовать собственные типы.

Это привело к недостатку дизайна, о котором вы говорите, и, следовательно, был введен автобокс.

РЕДАКТИРОВАТЬ

И конструкторы являются общедоступными, потому что они всегда были общедоступными. До появления мира автобокса в очень плохом коде вы хотели, чтобы new Integer (0)! = New Integer (0) было истинным. Это был недостаток больше, чем что-либо в оригинальном дизайне, однако, поскольку теперь он является частью общедоступного интерфейса, они не хотят ломать старый код.

Бьюсь об заклад, они могли бы отказаться от него сейчас, и большинству людей он понравится, поскольку автобоксинг просто работает.

-1
ответ дан 14 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: