我有一个小代码示例,我想将其包含在方法的 Javadoc 注释中。
/**
* -- ex: looping through List of Map objects --
* <code>
* for (int i = 0; i < list.size(); i++) {
* Map map = (Map)list.get(i);
* System.out.println(map.get("wordID"));
* System.out.println(map.get("word"));
* }
* </code>
*
* @param query - select statement
* @return List of Map objects
*/
问题是代码示例显示在 Javadoc 中,没有换行符,因此难以阅读。
-- ex: looping through List of Map objects -- for (int i = 0; i list.size(); i++) { Map map = (Map)list.get(i); System.out.println(map.get("wordID")); System.out.println(map.get("word")); }
Parameters
query - - select statement
Returns:
List of Map objects
我想我假设代码标签会处理换行符是错误的。在 Javadoc 注释中格式化代码示例的最佳方式是什么?
除了已经提到的 <pre>
标记之外,您还应该使用 @code
JavaDoc 注释,这将使处理 HTML 实体问题(尤其是泛型)变得更加轻松,例如:
* <pre>
* {@code
* Set<String> s;
* System.out.println(s);
* }
* </pre>
将给出正确的 HTML 输出:
Set<String> s;
System.out.println(s);
省略 @code
块(或使用 <code>
标记)将导致 HTML 如下所示:
Set s;
System.out.println(s);
作为参考,可以在 here 中找到 Java SE 8 中可用的标记描述的完整列表。
在 javadoc 注释中包含特定代码示例时,我遇到了非常艰难的时期。我想分享这个。请注意以下事项:
使用旧的 - 防止大括号被解释的标签
使用“new” {@code ...} - 标记以获取包含在输出中的泛型
通过“{@literal @}Override”在@Override 中转义@ 符号,因为javadoc 生成器“倾斜”在那里,因为@ 直接位于左大括号之后
删除 {@code 和 {@literal 前面的一个空格,以补偿内部空格并保持对齐
javadoc代码:
/** this methods adds a specific translator from one type to another type. `
* i.e.
* <pre>
* <code>new BeanTranslator.Builder()
* .translate(
* new{@code Translator<String, Integer>}(String.class, Integer.class){
* {@literal @}Override
* public Integer translate(String instance) {
* return Integer.valueOf(instance);
* }})
* .build();
* </code>
* </pre>
* @param translator
*/
打印为
new BeanTranslator.Builder()
.translate(
new Translator<String, Integer>(String.class, Integer.class){
@Override
public Integer translate(String instance) {
return Integer.valueOf(instance);
}})
.build();
内的 {@code}”时我收到警告
java 源代码有很多很好的例子。这是“String.java”头部的一个例子:
....
* is equivalent to:
* <p><blockquote><pre>
* char data[] = {'a', 'b', 'c'};
* String str = new String(data);
* </pre></blockquote><p>
* Here are some more examples of how strings can be used:
* <p><blockquote><pre>
* System.out.println("abc");
* String cde = "cde";
* System.out.println("abc" + cde);
* String c = "abc".substring(2,3);
* String d = cde.substring(1, 2);
* </pre></blockquote>
...
<pre><blockquote>...</blockquote></pre>
<p><blockquote><pre>
</pre></blockquote></p>
List<String>
。为此,我使用 <pre>{@code ... }</pre>
。
}
,@Daniel 将不起作用。这个右花括号将结束 {@code ...}
。
用 <pre></pre>
标记将您的多行代码括起来。
您需要 <pre></pre>
标记用于换行符,而其中的 {@code ... }
用于泛型。但是不允许将左大括号与 <generic>
标记放在同一行,因为这样所有内容都将再次显示在 1 行。
一行显示:
* ..
* <pre>
* {@code
* public List<Object> getObjects() {
* return objects;
* }
* </pre>
* ..
带有换行符的显示:
* ..
* <pre>
* {@code
* public List<Object> getObjects()
* {
* return objects;
* }
* </pre>
* ..
另一个奇怪的事情是,当您粘贴 {@code
的右大括号时,它会显示:
* ..
* <pre>
* {@code
* public List<Object> getObjects()
* {
* return objects;
* }
* }
* </pre>
* ..
输出:
public List<Object> getObjects()
{
return objects;
}
}
...
``)。您不需要 <code>
和 <pre>
标记。我在这个想法中编辑了你的答案。
{@code,
的结尾,因此第二个右大括号成为显示的简单文本。简而言之,问题是您在示例代码中使用@code 但没有大括号,或者您不使用并且被允许在纯 <pre> 中使用大括号。堵塞...
/**
* <blockquote><pre>
* {@code
* public Foo(final Class<?> klass) {
* super();
* this.klass = klass;
* }
* }
* </pre></blockquote>
**/
是保留行所必需的。
{@code 必须有自己的行
仅用于缩进。
public Foo(final Class<?> klass) {
super();
this.klass = klass;
}
使用 JDK8 更新
正确代码的最低要求是 <pre/>
和 {@code}
。
/**
* test.
*
* <pre>{@code
* <T> void test(Class<? super T> type) {
* System.out.printf("hello, world\n");
* }
* }</pre>
*/
产量
<T> void test(Class<? super T> type) {
System.out.printf("hello, world\n");
}
并且可选的环绕 <blockquote/>
插入缩进。
/**
* test.
*
* <blockquote><pre>{@code
* <T> void test(Class<? super T> type) {
* System.out.printf("hello, world\n");
* }
* }</pre></blockquote>
*/
产量
<T> void test(Class<? super T> type) {
System.out.printf("hello, world\n");
}
插入 <p>
或用 <p>
和 </p>
包围会产生警告。
这是我的两分钱。
正如其他答案已经说明的那样,您应该将 <pre>
</pre>
与 {@code
}
结合使用。
使用 pre 和 {@code}
将您的代码包裹在
和中可以防止您的代码折叠成一行;
将您的代码包装在 {@code } 中可以防止 <、> 以及介于两者之间的所有内容消失。当您的代码包含泛型或 lambda 表达式时,这特别有用。
注释问题
当您的代码块包含注释时,可能会出现问题。这可能是因为当 @
符号出现在 Javadoc 行的开头时,它被视为像 @param
或 @return
这样的 Javadoc 标记。例如,此代码可能会被错误地解析:
/**
* Example usage:
*
* <pre>{@code
* @Override
* public void someOverriddenMethod() {
在我的情况下,上面的代码将完全消失。
要解决此问题,该行不得以 @
符号开头:
/**
* Example usage:
*
* <pre>{@code @Override
* public int someMethod() {
* return 13 + 37;
* }
* }</pre>
*/
请注意,@code
和 @Override
之间有两个空格,以使内容与下一行对齐。在我的情况下(使用 Apache Netbeans)它被正确呈现。
我能够使用代码 1 中显示的以下片段生成好看的 HTML 文件。
* <pre>
* {@code
* A-->B
* \
* C-->D
* \ \
* G E-->F
* }
*</pre>
(代码 1)
正如预期的那样,代码 1 变成了图 1 中生成的 javadoc HTML 页面。
A-->B
\
C-->D
\ \
G E-->F
(图。1)
但是,在 NetBeans 7.2 中,如果您按 Alt+Shift+F(重新格式化当前文件),代码 1 会变成代码 2。
* <
* pre>
* {@code
* A-->B
* \
* C-->D
* \ \
* G E-->F
* }
* </pre>
(代码 2)
其中第一个 <pre>
现在被分成两行。代码 2 生成生成的 javadoc HTML 文件,如图 2 所示。
< pre> A-->B \ C-->D \ \ G E-->F
(图2)
Steve B 的建议(代码 3)似乎给出了最好的结果,并且即使在按下 Alt+Shift+F 后仍按预期格式化。
*<p><blockquote><pre>
* A-->B
* \
* C-->D
* \ \
* G E-->F
* </pre></blockquote>
(代码 3)
使用 Code 3 会产生相同的 javadoc HTML 输出,如图 1 所示。
<blockquote><pre>...
和 <pre>{@code....
之间存在显着差异,前者将省略泛型中的类型声明,但后者将保留它。
E.g.: List<MyClass> myObject = null;
与第一个显示为 List myObject = null;
,与第二个显示为 List<MyClass> myObject = null;
我刚刚阅读了 Javadoc 1.5 参考 here,只有 <
和 >
的代码必须包含在 {@code ...}
中。这里有一个简单的例子:
/**
* Bla bla bla, for example:
*
* <pre>
* void X() {
* List{@code <String>} a = ...;
* ...
* }
* </pre>
*
* @param ...
* @return ...
*/
.... your code then goes here ...
其他两种解决方案的组合似乎很完美:
* <pre>{@code
* {@literal @}Override
* public void someMethod() {
* Set<String> s;
* }
* }</pre>
IE。使用 <pre>{@code
开始,使用 }</pre>
结束片段。此外,将 @
替换为 {@literal @}
。
还没有找到更简单的解决方案。对于几十年来一直在积极发展的语言来说,这是非常可悲的。
如果您是 Android 开发人员,您可以使用:
<pre class=”prettyprint”>
TODO:your code.
</pre>
使用 Java 代码在 Javadoc 中漂亮地打印您的代码。
从 Java 18 (JEP 413) 开始,您可以使用 @snippet
标记:
/**
* -- ex: looping through List of Map objects --
* {@snippet :
* for (int i = 0; i < list.size(); i++) {
* Map map = (Map)list.get(i);
* System.out.println(map.get("wordID"));
* System.out.println(map.get("word"));
* }
* }
*
* @param query - select statement
* @return List of Map objects
*/
尝试用“pre”替换“code”。 HTML 中的 pre 标记将文本标记为预格式化,并且所有换行符和空格都将在您键入时完全显示。
我通过这两种方式工作没有任何问题:
<pre>
<code>
... java code, even including annotations
</code>
</pre>
和
<pre class="code">
... java code, even including annotations
</pre>
当然后者更简单,观察 class="code"
部分
我用 <pre class="brush: java"></pre>
标记括起我的示例代码,并将 SyntaxHighlighter 用于已发布的 javadocs。它不会伤害 IDE 并使已发布的代码示例美观。
使用 Java SE 1.6,看起来所有 UPPERCASE PRE 标识符都是在 Javadoc 中执行此操作的最佳方式:
/**
* <PRE>
* insert code as you would anywhere else
* </PRE>
*/
是最简单的方法。
我从 java.awt.Event 方法获得的 javadoc 示例:
/**
* <PRE>
* int onmask = SHIFT_DOWN_MASK | BUTTON1_DOWN_MASK;
* int offmask = CTRL_DOWN_MASK;
* if ((event.getModifiersEx() & (onmask | offmask)) == onmask) {
* ...
* }
* </PRE>
*/
这会产生看起来与常规代码完全相同的输出,常规代码间距和新行完好无损。
至少在 Visual Studio Code 中,您可以强制 Javadoc 注释通过将其包装在三个反引号中来尊重换行符,如下所示:
/** ```markdown
* This content is rendered in (partial) markdown.
*
* For example, *italic* and **bold** text works, but [links](https://www.google.com) do not.
* Bonus: it keeps single line-breaks, as seen between this line and the previous.
``` */