Javadoc注释中的多行代码示例

时间:2009-02-12 15:52:43

标签: java html javadoc

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

17 个答案:

答案 0 :(得分:706)

除了已经提到的<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);

(供参考,可在此处找到Java SE 8标签说明:Javadoc Tags

答案 1 :(得分:155)

我在javadoc评论中包含一个特定的代码示例时非常艰难。我想分享一下。
请注意以下事项:

  • 使用旧<code> - 标记以防止解释大括号
  • 使用“new”{@code ...} - 标记来获取输出中包含的泛型
  • 通过“@Override”转义{@literal @}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();

答案 2 :(得分:40)

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>
...

答案 3 :(得分:23)

使用<pre></pre>标记附上您的多行代码。

答案 4 :(得分:14)

您需要换行符的<pre></pre>标记,以及其中的{@code ... }作为泛型。但是不允许将左大括号放在与<generic>标签相同的行上,因为这样一切都将再次显示在一行上。

在一行显示:

* ..
* <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;
}
}

答案 5 :(得分:9)

/**
 * <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>或周围会产生警告。

答案 6 :(得分:4)

我能够使用以下代码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)

史蒂夫B的建议(代码3)似乎给出了最好的结果,并且即使在按下Alt + Shift + F之后仍然按预期格式化。

*<p><blockquote><pre>         
* A-->B
*  \
*   C-->D
*    \   \
*     G   E-->F
* </pre></blockquote>

(代码3)

使用代码3产生相同的javadoc HTML输出,如图1所示。

答案 7 :(得分:3)

这是我的两分钱。

其他答案已经说明,您应该结合使用 <pre> </pre> {@code }

使用pre{@code}

  • 将代码包装在<pre></pre>内可防止您的代码折叠到一行上;
  • 将代码包装在{@code }内可防止<>以及两者之间的所有内容消失。当您的代码包含泛型或lambda表达式时,此功能特别有用。

注释问题

当您的代码块包含注释时,可能会出现问题。这可能是因为当@符号出现在Javadoc行的开头时,它被视为Javadoc标记,例如@param@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),它可以正确呈现。

答案 8 :(得分:3)

<blockquote><pre>...<pre>{@code....之间存在显着差异前者将省略泛型中的类型声明,但后者将保留它。

E.g.: List<MyClass> myObject = null; 显示为List myObject = null;显示为List<MyClass> myObject = null;,显示为{{1}}显示第二

答案 9 :(得分:2)

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

<pre class=”prettyprint”>

TODO:your code.

</pre>

使用Java代码在Javadoc中打印代码。

答案 10 :(得分:1)

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

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

即。使用 <pre>{@code 开始和 }</pre> 结束代码段。此外,将 @ 替换为 {@literal @}

还没有找到更简单的解决方案。对于一种几十年来一直在积极发展的语言来说,这很令人难过。

答案 11 :(得分:1)

我刚刚阅读了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 ...

答案 12 :(得分:1)

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

答案 13 :(得分: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>
 */

这会产生与常规代码完全相同的输出,常规代码间距和新行保持不变。

答案 14 :(得分:0)

我将示例代码附加<pre class="brush: java"></pre>标记,并使用SyntaxHighlighter发布javadoc。它不会损害IDE并使发布的代码示例更美观。

答案 15 :(得分: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.
 ``` */

答案 16 :(得分:0)

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

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

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

当然后者更简单,请注意class="code"部分