Jep 401 представит «классы значений» в языке программирования Java. Как таковые, у них нет идентичности, поскольку их внутреннее состояние полностью описывает то, чем они являются. Нецели этого JEP содержат следующий пункт:
Это не цель автоматически рассматривать существующие классы как классы значений, даже если они имеют некоторые общие характеристики классов значений. [...]
Теперь, чтобы пометить любой существующий класс или запись как «класс значения», вам просто нужно добавить перед ним ключевое слово value new, и вуаля, он потеряет свою идентичность. Это заставило меня задуматься:
Вопрос: Когда запись не является типом значения?
JEP на самом деле не касается этого. Там просто говорится:
Разработчики могут объявлять свои собственные классы значений, применяя модификатор value к любому классу, экземпляры которого должны быть неизменяемыми и взаимозаменяемыми:
- Неизменяемые: все поля экземпляра класса должны быть окончательными, а значение домена, представленное экземпляром, не будет меняться со временем; и
- Взаимозаменяемость: нет необходимости различать два отдельно созданных экземпляра, которые представляют одно и то же значение домена
Классы записей являются окончательными и все их поля являются окончательными, поэтому они часто являются хорошими кандидатами на роль классов значений.
Брайан Гетц, один из архитекторов языка Java, часто описывает записи как «данные, все данные и ничего, кроме данных». Но если записи на самом деле представляют собой «не что иное, как данные», не означает ли это, что они не должны иметь «дополнительную» идентичность; которое, по крайней мере в моей мысленной модели, представляет собой просто невидимое поле, содержащее некоторое значение, мягко эквивалентное результату System.identityHashCode(this)?
Далее
- Каковы некоторые реальные варианты использования записей, которые не являются типами, основанными на значениях?
- (Почему) java.lang.Enum (не) хороший кандидат на роль класса значений?
Подробнее здесь: https://stackoverflow.com/questions/798 ... value-type
Мобильная версия