Javadoc:静态最终枚举引用的文档值
Javadoc : document value of static final enum reference
假设我有:
public enum Color {
RED,
GREEN,
YELLOW
}
然后在我的代码的其他地方我有
public static final Color DEFAULT_COLOR = Color.RED;
现在我想向我的 Javadoc 的读者说明 DEFAULT_COLOR
的值是什么(当然我不想重复)。怎么做?
问题是——正如我所见——这样的引用(尽管声明为 static final
并指向一个枚举)将 不会 出现在 Javadoc 的“常量- values.html”。我看不出它不应该的技术原因,但据我所知它没有。也许我只是误解了?
细化
准确地说,问题是关于 static final
枚举变量的声明,其中右侧是 JLS 定义的单个标识符,因此不包括 RHS 是更复杂表达式的情况.这类似于当前 Javadoc 分配原始类型的行为,如果 RHS 不是所谓的 'constant expression',Javadoc 将不会尝试呈现。我们当然可以期待 Javadoc 做同样的事情,我可以毫不含糊地渲染吗?枚举分析,不是吗?通过说 RHS 必须是一个单一的标识符,我们将自己限制在 - IMO - 应该明确可用于 Javadoc 的东西。
正如评论所说,只有当该值是一个编译时常量时,javadoc 才会渲染它(很少有东西是 - true
、false
、数字文字, string constants 是它开始的地方。所有操作数都是常量的运算符也是常量。然后用这样一个常量初始化的任何静态最终字段本身就是常量。因此,static final int foo = SOME_OTHER_FIELD + YET_ANOTHER + 5;
可以是常量。
这意味着 Color.RED 不是常数,因此未显示。
不只是'resolving things'的问题,而是渲染的问题
假设你写了这个:
private static final List<String> COUNTRIES = List.of(... all 300-or-so countries here_);
是否应该将整个列表注入到 javadoc 中?希望这个例子清楚地表明答案并不总是 'yes',并且画一条线并不是真正可行的。
即使答案是肯定的,您建议 javadoc 如何呈现此信息?只需获取原始源代码并将其直接转储到 html?获取原始源代码并自动重新格式化?还有哪些其他选择?
Javadoc 不能假定它可以解析表达式。假设表达式是:
public static final Color DEFAULT_COLOR = Math.random() > 0.5 ? Color.RED : Color.BLUE;
这应该清楚地表明,您没有任何可行的选择来以任何方式呈现非 CTC,除了显示应用了某种程度的清理的源,或者根本不显示任何内容。
您可能想看到的是:
- JVM 规范获得了将枚举视为编译时常量的能力(这是一个显着差异;在 class 级别,常量只是逐字存储,具有它们的实际值,在 class 文件,而不存储非 CTC;而是生成一个
static {}
块来生成这些文件。例如,public static final long STAMP = System.currentTimeMillis();
变成一个 class 文件,该文件具有静态init 'method' 运行该代码 - 你不能将其减少为常量)。这是对所有 java 的重大更新,只是为了 javadoc 的好处,这很奇怪。
- javadoc 工具与 JVM 规范分道扬镳,在 CTC 上走自己的路。这似乎很烦人。您当然希望
public static final Color DEFAULT_COLOR = SomeOtherClass.DEFAULT_COLOR;
也能正常工作(如果它们是整数,它就会工作!),所以这会使 javadoc
复杂且不一致。只是不值得。
- 一个选项,告诉 javadoc 只获取初始化程序的源代码并将其逐字呈现(或者可能使用轻微的重新格式化)到 HTML.
第三个看起来还不错,大概是这样的:
/** {@showDefault} */
public static final Color DEFAULT_COLOR = Color.RED;
但是 javadoc 根本无法那样工作。
好的,那么我该怎么做而不重复自己呢?
你不能。抱歉。
假设我有:
public enum Color {
RED,
GREEN,
YELLOW
}
然后在我的代码的其他地方我有
public static final Color DEFAULT_COLOR = Color.RED;
现在我想向我的 Javadoc 的读者说明 DEFAULT_COLOR
的值是什么(当然我不想重复)。怎么做?
问题是——正如我所见——这样的引用(尽管声明为 static final
并指向一个枚举)将 不会 出现在 Javadoc 的“常量- values.html”。我看不出它不应该的技术原因,但据我所知它没有。也许我只是误解了?
细化
准确地说,问题是关于 static final
枚举变量的声明,其中右侧是 JLS 定义的单个标识符,因此不包括 RHS 是更复杂表达式的情况.这类似于当前 Javadoc 分配原始类型的行为,如果 RHS 不是所谓的 'constant expression',Javadoc 将不会尝试呈现。我们当然可以期待 Javadoc 做同样的事情,我可以毫不含糊地渲染吗?枚举分析,不是吗?通过说 RHS 必须是一个单一的标识符,我们将自己限制在 - IMO - 应该明确可用于 Javadoc 的东西。
正如评论所说,只有当该值是一个编译时常量时,javadoc 才会渲染它(很少有东西是 - true
、false
、数字文字, string constants 是它开始的地方。所有操作数都是常量的运算符也是常量。然后用这样一个常量初始化的任何静态最终字段本身就是常量。因此,static final int foo = SOME_OTHER_FIELD + YET_ANOTHER + 5;
可以是常量。
这意味着 Color.RED 不是常数,因此未显示。
不只是'resolving things'的问题,而是渲染的问题
假设你写了这个:
private static final List<String> COUNTRIES = List.of(... all 300-or-so countries here_);
是否应该将整个列表注入到 javadoc 中?希望这个例子清楚地表明答案并不总是 'yes',并且画一条线并不是真正可行的。
即使答案是肯定的,您建议 javadoc 如何呈现此信息?只需获取原始源代码并将其直接转储到 html?获取原始源代码并自动重新格式化?还有哪些其他选择?
Javadoc 不能假定它可以解析表达式。假设表达式是:
public static final Color DEFAULT_COLOR = Math.random() > 0.5 ? Color.RED : Color.BLUE;
这应该清楚地表明,您没有任何可行的选择来以任何方式呈现非 CTC,除了显示应用了某种程度的清理的源,或者根本不显示任何内容。
您可能想看到的是:
- JVM 规范获得了将枚举视为编译时常量的能力(这是一个显着差异;在 class 级别,常量只是逐字存储,具有它们的实际值,在 class 文件,而不存储非 CTC;而是生成一个
static {}
块来生成这些文件。例如,public static final long STAMP = System.currentTimeMillis();
变成一个 class 文件,该文件具有静态init 'method' 运行该代码 - 你不能将其减少为常量)。这是对所有 java 的重大更新,只是为了 javadoc 的好处,这很奇怪。 - javadoc 工具与 JVM 规范分道扬镳,在 CTC 上走自己的路。这似乎很烦人。您当然希望
public static final Color DEFAULT_COLOR = SomeOtherClass.DEFAULT_COLOR;
也能正常工作(如果它们是整数,它就会工作!),所以这会使javadoc
复杂且不一致。只是不值得。 - 一个选项,告诉 javadoc 只获取初始化程序的源代码并将其逐字呈现(或者可能使用轻微的重新格式化)到 HTML.
第三个看起来还不错,大概是这样的:
/** {@showDefault} */
public static final Color DEFAULT_COLOR = Color.RED;
但是 javadoc 根本无法那样工作。
好的,那么我该怎么做而不重复自己呢?
你不能。抱歉。