Как я должен отметить, что класс является неизменным в Java?

14

Недавно я наткнулся на то, насколько полезны неизменяемые объекты и что, например, если вы передаете элементы конструктору и ваш класс должен быть неизменным, вы должны скопировать эти элементы, если они сами не являются неизменяемыми.

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

public A(B foo)

и Bне является неизменным, Aя должен был бы скопировать B. Теперь представьте, что Bкажется неизменным, но сам по себе имеет изменяемые классы в конструкторе и так далее.

Есть ли стандарт или лучшие практики для документирования, если класс неизменен в Java? Кажется, @immutableв Javadoc нет ключевого слова.

@Immutable аннотаций , кажется, что - то совершенно другое для производства авто класса и не является частью стандартной Java.

Aufziehvogel
источник
2
Во-первых, защитное копирование позволяет обойти это. Во-вторых, способ документировать это класс Javadoc
raptortech97
"способ документировать это класс Javadoc" Есть ли стандартный способ сделать это? Тогда это будет уже принятый ответ.
Aufziehvogel
@ raptortech97 Одним из основных преимуществ неизменяемых классов является то, что нет необходимости в защитном копировании. Если должно быть защищенное копирование предположительно неизменного объекта, вы делаете это неправильно.
Брюс
1
@itsbruce Он говорил о копировании изменяемых объектов. Также есть одна причина скопировать неизменный объект - локальность кэша. Некоторые сборщики мусора сохраняют относительный порядок объектов, поэтому объекты, размещенные вместе, остаются вместе.
Доваль
Ты прав. Виноват.
Брюс

Ответы:

7

Глядя на документацию Stringкласса (я выделил жирный текст):

Класс String представляет строки символов. Все строковые литералы в программах Java, такие как «abc», реализованы как экземпляры этого класса. Строки постоянны; их значения не могут быть изменены после их создания. Строковые буферы поддерживают изменяемые строки. Поскольку объекты String являются неизменяемыми, они могут использоваться совместно.

Как вы можете видеть, здесь нет конкретной маркировки или других маркеров, однако они указывают в JavaDoc, описывающем класс, что этот Stringкласс представляет собой постоянный неизменный объект.

Таким образом, предполагая, что вы следовали инструкциям, приведенным в этом руководстве по Oracle, для создания неизменяемого класса, чтобы убедиться, что неизменность класса задокументирована, вы должны просто указать в нем JavaDoc, описывающий класс и его значение. делает.

Если это по-прежнему не соответствует вашим потребностям, вы можете посмотреть, как можно создавать собственные теги JavaDoc здесь .

npinti
источник