Подтвердить что ты не робот

Как использовать тег @value в javadoc?

Я использую класс с частным конструктором вместо enum (это требование). И теперь я пытаюсь добавить теги javadoc для документирования каждого объекта public static final.

1) Что такое место для размещения тегов javadoc: например, ob1 или ob2?

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() {}   
}
4b9b3361

Ответ 1

Я не думаю, что ответ Kayaman достаточно, поскольку вопрос заключается в том, как использовать тег @value в javadocs.

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

В eclipse, когда вы

/**
 * {@value #ob2} object2 description
 */ 
public static final Object ob2 = new Object();

сгенерированные Javadocs являются {@value # ob2} описанием объекта2. Однако, если у вас есть

/**
 * {@value #ob2} object2 description
 */ 
public static final String ob2 = "hello";

сгенерированные Javadocs являются "hello" object2 description (ожидаемый результат).

Итак, в общем, вы правильно используете тег @value в javadocs, но значение будет отображаться только правильно, если поле было инициализировано литеральным значением.

Ответ 2

2) Оба варианта генерируют ошибку в теге IDEA @value, чтобы ссылаться на поле с постоянным intializer.

Не имеет смысла добавлять непостоянные выражения в 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 явно говорит так: нет способа сообщить компилятору, что в пользовательском классе.