Jak mam odnotować, że klasa jest niezmienna w Javie?

14

Ostatnio natknąłem się na to, jak przydatne są niezmienne obiekty i że np. Jeśli przekazujesz elementy do konstruktora, a twoja klasa powinna być niezmienna, musisz skopiować te elementy, jeśli same nie są niezmienne.

Wymaga to dużej ilości sprawdzania lub wiedzy na temat mojego projektu, ponieważ jeśli mam

public A(B foo)

i Bnie jest niezmienny, Amusiałbym skopiować B. Teraz wyobraź sobie, Bże wydaje się niezmienny, ale sam ma zmienne klasy w konstruktorze i tak dalej.

Czy istnieje standard lub najlepsza praktyka dokumentowania, jeśli klasa jest niezmienna w Javie? Wygląda na to, że @immutablew Javadoc nie ma słowa kluczowego.

@Immutable adnotacja wydaje się być czymś zupełnie inna dla generacji klasy auto i nie jest częścią standardu Java.

Aufziehvogel
źródło
2
Po pierwsze, defensywne kopiowanie pozwala ci to obejść. Po drugie, sposobem na udokumentowanie tego jest klasa Javadoc
raptortech97
„sposobem na udokumentowanie tego jest klasa Javadoc” Czy istnieje standardowy sposób na zrobienie tego? To byłaby już zaakceptowana odpowiedź.
Aufziehvogel
@ raptortech97 Jedną z głównych zalet niezmiennych klas jest to, że nie ma potrzeby kopiowania obronnego. Jeśli konieczne jest defensywne kopiowanie rzekomo niezmiennego obiektu, robisz to źle.
itsbruce
1
@itsbruce Mówił o kopiowaniu obiektów zmiennych. Jest też jeden powód do skopiowania niezmiennego obiektu - lokalizacja pamięci podręcznej. Niektóre śmieciarki zachowują względną kolejność obiektów, więc obiekty przydzielone razem pozostają razem.
Doval
Masz rację. Mój błąd.
itsbruce

Odpowiedzi:

7

Patrząc na dokumentację Stringklasy (zrobiłem pogrubiony tekst):

Klasa String reprezentuje ciągi znaków. Wszystkie literały łańcuchowe w programach Java, takie jak „abc”, są implementowane jako instancje tej klasy. Ciągi są stałe; ich wartości nie można zmienić po ich utworzeniu. Bufory łańcuchów obsługują łańcuchy zmienne. Ponieważ obiekty String są niezmienne, można je udostępniać.

Jak widać, nie ma żadnych specjalnych etykiet ani innych znaczników, jednak w JavaDoc określają klasę, że Stringklasa reprezentuje stały, niezmienny obiekt.

Tak więc, zakładając, że postępowałeś zgodnie z instrukcjami zawartymi w tym samouczku Oracle, aby stworzyć niezmienną klasę, aby upewnić się, że niezmienność klasy jest udokumentowana, powinieneś tylko upewnić się, że wspomniałeś w niej w JavaDoc opisującym klasę i co to jest robi.

Jeśli to nadal nie pasuje do tego, co trzeba, można przyjrzeć się w jaki sposób można budować niestandardowe znaczniki javadoc tutaj .

npinti
źródło