クラスはJavaで不変であることをどのように注釈する必要がありますか?


14

私は最近、不変オブジェクトの有用性につまずきました。たとえば、要素をコンストラクタに渡し、クラスを不変にする必要がある場合、これらの要素が不変でない場合はこれらの要素をコピーする必要があります。

これには、プロジェクトに関する多くの確認または知識が必要です。

public A(B foo)

かつB不変ではない、A私はコピーする必要があるだろうB。今でBは不変のように思えますが、それ自体はコンストラクタなどに可変クラスを持っています。

Javaでクラスが不変である場合、文書化するための標準またはベストプラクティスはありますか?@immutableJavadoc にはキーワードがないようです。

@Immutable注釈は自動クラスの生成ではなく、標準のJavaの一部については全く違うもののようです。


2
まず、防御的なコピーを使用すると、それを回避できます。第二に、それを文書化する方法は、クラスJavadoc
raptortech97

「ドキュメント化する方法はクラスJavadocです」これを行う標準的な方法はありますか?そして、これはすでに受け入れられた答えでしょう。
-Aufziehvogel

@ raptortech97不変クラスの主な利点の1つは、防御コピーの必要ないことです。不変とされるオブジェクトの防御コピーが必要な場合、それは間違っています。
-itsbruce

1
@itsbruce彼は可変オブジェクトのコピーについて話していました。また、不変オブジェクトをコピーする理由の1つとして、キャッシュの局所性があります。一部のガベージコレクターは、オブジェクトの相対的な順序を保持するため、一緒に割り当てられたオブジェクトは一緒に残ります。
ドーバル

あなたが正しい。私の悪い。
-itsbruce

回答:


7

Stringクラスのドキュメントを見る(太字のテキストは私がやったことです):

Stringクラスは文字列を表します。「abc」などのJavaプログラムのすべての文字列リテラルは、このクラスのインスタンスとして実装されます。 文字列は定数です。それらの値は、作成後に変更することはできません。文字列バッファは可変文字列をサポートします。Stringオブジェクトは不変であるため、共有できます。

ご覧のとおり、特定のラベル付けや他のマーカーはありませんが、クラスを記述するJavaDocで、Stringクラスが定数の不変オブジェクトを表すことを指定しています。

したがって、この Oracleチュートリアルの指示に従って不変クラスを作成し、クラスの不変性が文書化されていることを確認すると仮定すると、クラスとその内容を説明するJavaDocで必ず言及する必要があります。します。

それでも必要なものに合わない場合は、ここでカスタムJavaDocタグを作成する方法を確認できます


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.