Yuriy Tsarkov
Yuriy Tsarkov

Reputation: 2548

javadoc @value annotation issue in Eclipse

I've read a lot here but didn't find the answer. I faced a problem with a @value Javadoc annotation.

IDE: Eclipse Oxygen.1a Release (4.7.1a)

If I place it on the String variable it is ok and works properly, but if the variable is Integer then everything is bad.

Here is a code where variables stand side by side:

/**
 * Default delimiter. {@value #DEFAULT_LIST_SEPARATOR}
 */
public final static String DEFAULT_LIST_SEPARATOR = ",";

/**
 * Default int value. {@value #START_VALUE}
 */
public final static Integer START_VALUE = 20000;

and for the first variable description shows properly, but for the other, I see only {@value #START_VALUE}.

Where am I wrong, guys?

Upvotes: 1

Views: 1859

Answers (3)

howlger
howlger

Reputation: 34135

If Integer instead of int is used, @value is not resolved.

In your example, the constant START_VALUE is an object of the type Integer which wraps the value 20000. So the question is, does @value support autoboxing? The Java Language Specification does not cover Javadoc comments. There seems to be no formal specification for Javadoc, just the following simple description for @value which does not answer the question:

Displays constant values.

If using the the Javadoc tool of the Oracle Java SDK to generate HTML as de facto standard, @value is allowed for int, but not for the type Integer. The Javadoc tools of Oracle's Java 8 and Java 9 Development Kit report the same error:

error: value does not refer to a constant
   * Default int value. {@value #START_VALUE}
                        ^

If using {@value} instead of {@value #START_VALUE} the error becomes error: {@value} not allowed here.

Let's have a look at following cases:

public class JavadocValue {

    /** STRING = {@value} */
    public final static String STRING = "lorem ipsum";

    /** STRING_CONCATENATION = {@value} */
    public final static String STRING_CONCATENATION = "lorem" + " ipsum";

    /** STRING_COMPUTATION = {@value} */
    public final static String STRING_COMPUTATION = System.getProperty("path.separator");

    /** INT = {@value} */
    public final static int INT = 42;

    /** INT_COMPUTATION = {@value} */
    public final static int INT_COMPUTATION = (20 + 1) * 2;

    /** INTEGER = {@value} */
    public final static Integer INTEGER = 42;

    /** INTEGER_COMPUTATION = {@value} */
    public final static Integer INTEGER_COMPUTATION = Integer.valueOf("42");

    /** ENUM = {@value} */
    public final static MyEnum ENUM = MyEnum.VALUE_B;
    public enum MyEnum { VALUE_A, VALUE_B };

}

In Eclipse @value is resolved as it is in the Oracle Javadoc tool:

STRING = "lorem ipsum"
STRING_CONCATENATION = "lorem ipsum"
STRING_COMPUTATION = [error/unresolved]
INT = 42
INT_COMPUTATION = 42
INTEGER = [error/unresolved]
INTEGER_COMPUTATION = [error/unresolved]
ENUM = [error/unresolved]

Conclusion: Use @value for constants of a primitive type or of String only.

Upvotes: 4

Dina Bogdan
Dina Bogdan

Reputation: 4698

Do a clean project and an eclipse restart :) it may work well after these :)

Upvotes: 0

Bohdan Petrenko
Bohdan Petrenko

Reputation: 1155

With Intellij IDEA 2017.2.6 code above works fine: enter image description here

So, it may be just eclipse bug.

Upvotes: 0

Related Questions