Como devo anotar que uma classe é imutável em Java?

14

Recentemente, deparei com a utilidade de objetos imutáveis ​​e que, por exemplo, se você passa elementos para um construtor e sua classe deve ser imutável, você deve copiar esses elementos se eles não forem imutáveis.

Isso requer muita verificação ou conhecimento sobre o meu projeto, porque se eu tiver

public A(B foo)

e Bnão é imutável, Aeu teria que copiar B. Agora imagine Bparece imutável, mas ele próprio tem classes mutáveis ​​no construtor e assim por diante.

Existe um padrão ou prática recomendada para documentar se uma classe é imutável em Java? Parece que não há nenhuma @immutablepalavra-chave no Javadoc.

A anotação @Immutable parece ser algo totalmente diferente para a geração automática de classes e não faz parte do Java padrão.

Aufziehvogel
fonte
2
Em primeiro lugar, a cópia defensiva permite contornar isso. Em segundo lugar, a forma de documentar é a classe Javadoc
raptortech97
"a maneira de documentar é a classe Javadoc" Existe uma maneira padrão de fazer isso? Então essa já seria a resposta aceita.
Aufziehvogel
@ raptortech97 Uma das principais vantagens das classes imutáveis ​​é que não há necessidade de cópias defensivas. Se houver uma cópia defensiva de um objeto supostamente imutável, você está fazendo errado.
itsbruce
1
@itsbruce Ele estava falando sobre copiar objetos mutáveis. Além disso, há um motivo para copiar uma localidade imutável de cache de objetos. Alguns coletores de lixo preservam a ordem relativa dos objetos, para que os objetos alocados permaneçam juntos.
D
Você está certo. Foi mal.
itsbruce

Respostas:

7

Examinando a documentação da Stringclasse (texto em negrito é algo que eu fiz):

A classe String representa cadeias de caracteres. Todos os literais de cadeia de caracteres nos programas Java, como "abc", são implementados como instâncias dessa classe. Strings são constantes; seus valores não podem ser alterados após serem criados. Buffers de string suportam strings mutáveis. Como os objetos String são imutáveis, eles podem ser compartilhados.

Como você pode ver, não há rotulagem específica ou outros marcadores; no entanto, eles especificam no JavaDoc que descreve a classe que a Stringclasse representa um objeto constante e imutável.

Assim, assumindo que você seguiu as instruções fornecidas neste tutorial do Oracle para criar uma classe imutável, para garantir que a imutabilidade da classe esteja documentada, você deve mencionar nela o JavaDoc que descreve a classe e o que faz.

Se isso ainda não se adequar ao que você precisa, você pode dar uma olhada em como criar tags JavaDoc personalizadas aqui .

npinti
fonte