私は列挙型の代わりにプライベートコンストラクタを持つクラスを使用しています(これは要件です)。そして今、各public static final
エンティティをドキュメント化するjavadocタグを追加しようとしています。
1)ob1
やob2
のようなjavadocタグを配置するのに望ましい場所は何ですか?
2)両方のオプションがIDEA @value tag must reference field with a constant intializer.
でエラーを生成します
/**
* {@value #ob1} object1 description
*/
public class MyClass {
public static final Object ob1 = new Object();
/**
* {@value #ob2} object2 description
*/
public static final Object ob2 = new Object();
private MyClass() {}
}
質問はjavadocsで@valueタグを使用する方法であるため、Kayamanの答えは十分ではないと思います。
問題は、参照されているフィールドの値がリテラル値ではないという事実にあると思います。
Eclipseで、
/**
* {@value #ob2} object2 description
*/
public static final Object ob2 = new Object();
生成されるJavadocは{@ value#ob2} object2 descriptionです。しかし、あなたが持っているとき
/**
* {@value #ob2} object2 description
*/
public static final String ob2 = "hello";
生成されたJavadocは"hello" object2 description(予想される出力)です。
したがって、要約すると、javadocsで@valueタグを正しく使用していますが、フィールドがリテラル値で初期化されている場合にのみ値が正しくレンダリングされます。
2)両方のオプションがIDEAでエラーを生成します。@ valueタグは、定数の初期化子を持つフィールドを参照する必要があります。
非定数式 をJavadocに追加することはあまり意味がありません。
最初は、最も理にかなった動作はtoString
をJavadocに追加することだと考えるかもしれません。しかし、その後、次のような可変オブジェクトがあった場合はどうなりますか?
class MutableInteger {
public int i;
public String toString() { return Integer.toString(i); }
}
次のようなJavadoc
/**
* {@value #obj}
*/
class Class {
public static final MutableInteger obj = new MutableInteger(0);
}
その後、後で簡単に行うことができます:
Class.obj.i = 1;
したがって、0
をJavadocに追加してもそれほど意味はありません。
文字列は不変であり、JLSが明示的にそう言っているため、文字列に対してのみ機能します。コンパイラにカスタムクラスについて通知する方法はありません。