578

我有一个小代码示例,我想将其包含在方法的 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 注释中格式化代码示例的最佳方式是什么?

4

18 回答 18

808

除了已经提到的<pre>标签之外,您还应该使用@codeJavaDoc 注释,当涉及到 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);

作为参考,可以在此处找到 Java SE 8 中可用的标记描述的完整列表。

于 2009-02-12T16:26:42.633 回答
180

在 javadoc 注释中包含特定代码示例时,我遇到了非常艰难的时期。我想分享这个。
请注意以下事项:

  • 使用 old <code>- 标签来防止大括号被解释
  • 使用“new” {@code ...}- 标记以获取包含在输出中的泛型
  • @Override通过“ ”转义 @ 登录,{@literal @}Override因为 javadoc 生成器“倾斜”在那里,因为 @ 直接在左大括号之后
  • {@code删除and前面的一个空格{@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();
于 2012-11-22T12:13:56.307 回答
41

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>
...
于 2009-02-12T15:59:31.247 回答
25

用标签括起来你的多行代码<pre></pre>

于 2009-02-12T15:56:51.720 回答
18

您需要<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;
}
}
于 2011-08-04T12:35:47.850 回答
10
/**
 * <blockquote><pre>
 * {@code
 * public Foo(final Class<?> klass) {
 *     super();
 *     this.klass = klass;
 * }
 * }
 * </pre></blockquote>
 **/
  • <pre/>是保留行所必需的。
  • {@code必须有自己的线路
  • <blockquote/>只是为了缩进。
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>产生警告。

于 2014-03-05T10:14:01.967 回答
6

这是我的两分钱。

正如其他答案已经说明的那样,您应该<pre> </pre>{@code }.

使用pre{@code}

  • 把你的代码包裹在里面<pre></pre>防止你的代码折叠成一行;
  • 将您的代码包装在内部{@code }可以防止<,>以及介于两者之间的所有内容消失。当您的代码包含泛型或 lambda 表达式时,这特别有用。

注释问题

当您的代码块包含注释时,可能会出现问题。这可能是因为当@符号出现在 Javadoc 行的开头时,它被认为是一个 Javadoc 标记,如@paramor @return。例如,此代码可能会被错误地解析:

/**
 * Example usage:
 *
 * <pre>{@code
 * @Override
 * public void someOverriddenMethod() {

在我的情况下,上面的代码将完全消失。

要解决此问题,该行不得以@符号开头:

/**
 * Example usage:
 *
 * <pre>{@code  @Override
 * public int someMethod() {
 *     return 13 + 37;
 * }
 * }</pre>
 */

@code请注意,和之间有两个空格@Override,以保持与下一行对齐。在我的情况下(使用 Apache Netbeans)它被正确呈现。

于 2018-08-24T10:33:22.057 回答
5

我能够使用代码 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 所示。

于 2013-02-21T15:26:37.790 回答
3

和之间有一个显着的区别<blockquote><pre>...<pre>{@code....前者将省略泛型中的类型声明,但后者将保留它。

E.g.: List<MyClass> myObject = null;List myObject = null;与第一个和List<MyClass> myObject = null;第二个一样 显示

于 2012-07-19T09:24:47.633 回答
3

我只是在这里阅读了 Javadoc 1.5 参考,只有带有<和的代码>必须包含在里面{@code ...}。这里有一个简单的例子:

 /** 
 * Bla bla bla, for example:
 *
 * <pre>
 * void X() {
 *    List{@code <String>} a = ...;
 *    ...
 * }
 * </pre>
 *
 * @param ...
 * @return ...
 */
 .... your code then goes here ...
于 2017-03-10T10:43:08.420 回答
3

其他两种解决方案的组合似乎很完美:

* <pre>{@code
*     {@literal @}Override
*     public void someMethod() {
*         Set<String> s;
*     }
* }</pre>

IE。用于<pre>{@code开始和}</pre>结束片段。另外,替换@{@literal @}.

还没有找到更简单的解决方案。对于几十年来一直在积极发展的语言来说,这是非常可悲的。

于 2021-05-12T23:32:26.390 回答
2

如果您是 Android 开发人员,您可以使用:

<pre class=”prettyprint”&gt;

TODO:your code.

</pre>

使用 Java 代码在 Javadoc 中漂亮地打印您的代码。

于 2015-08-29T09:02:09.500 回答
1

尝试用“pre”替换“code”。HTML 中的 pre 标记将文本标记为预格式化,并且所有换行符和空格都将在您键入时完全显示。

于 2009-02-12T15:58:40.953 回答
1

从 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
 */
于 2021-11-03T16:08:45.860 回答
0

我用标签附上了我的示例代码,<pre class="brush: java"></pre>并将SyntaxHighlighter用于已发布的 javadocs。它不会伤害 IDE 并使已发布的代码示例美观。

于 2011-09-07T05:28:50.713 回答
0

使用 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>
 */

这会产生看起来与常规代码完全相同的输出,常规代码间距和新行完好无损。

于 2012-06-07T15:20:54.200 回答
0

至少在 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.
 ``` */
于 2019-10-28T14:24:12.293 回答
0

我通过这两种方式工作没有任何问题:

<pre>
<code>
 ... java code, even including annotations
</code>
</pre>

<pre class="code">
 ... java code, even including annotations
</pre>

当然后者更简单,观察class="code"部分

于 2020-09-28T16:42:44.600 回答