Javadoc注释中的多行代码示例


531

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

Answers:


743

除了已经提到的<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标记说明:Javadoc标记


63
我本来也会这么想,但不幸的是,您仍然需要添加<pre>标记才能获得换行符。
Fabian Steeg

12
不幸的是,当您按ctrl + shift + F(Eclipse中的格式代码)时,Eclipse弄乱了{@code}标记,并用{&#064; code ...代替它
jpdaigle 2010年

3
@jpdaigle我只是在Eclipse Galileo和Helios中尝试过此操作,而格式化程序对我而言并不能替代任何东西(在Mac OS上,但我也从未见过该格式化程序在其他平台上也能做到这一点)。
Fabian Steeg 2010年

30
另一个不幸的是,如果示例代码中使用大括号“ {}”的块,则第一个右括号将终止@code块。解决它的一种方法是使用(等待...)html实体作为大括号。我看不到带有块的代码的<pre>标签的引人注目的参数。
2011年

2
Eclipse弄乱了{@code}标记,并用{&#064; code替换了它- 这不是因为Eclipse,而是因为(bug?)javadoc实用程序。如果您在多行代码中{@code ...多...}然后javadoc中未能正确分析:(有@字符,至少这是我与Oracle JDK1.7.0_45的javadoc执行看到的。

166

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

  • 使用<code>old-标记以防止大括号被解释
  • “ 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
这行得通,但是运行javadoc时输出警告“ <code>中的警告:{@ code}”时,我得到一个警告
Shane Rowatt 2015年

3
这是一个可行的方法,在我的日食(4.6.2)中,可接受的答案效果不佳。
Eric Wang

我想知道为什么所有这些都是必要的,我的intellij 13和更高版本可以与接受的答案中的代码配合使用。这仅仅是一个月食问题吗?
bvdb

是的,我在IntelliJ 11和更高版本中也看到了此功能。IntelliJ正确处理它。不幸的是,Eclipse无法正确呈现JavaDoc(悬停状态),并且会忽略换行和html换行符。我试图找到一种在两个IDE上都可以正常使用的解决方案,因为它们是当今使用的两个顶级IDE。
Michael M

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

9
总结来说,<pre><blockquote>...</blockquote></pre>
Jin Kwon

6
而是<p><blockquote><pre> </pre></blockquote></p>
masterxilo 2014年

@JinKwon遗憾的是,这并不总是有效,在我的代码段中也没有:((在开始时添加{@代码,即使结束时也无法达到}
benez

这似乎适用于大多数代码,但不能转义诸如中的尖括号List<String>。为此,我正在使用<pre>{@code ... }</pre>
丹尼尔(Daniel)


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

4
欢迎使用Stack Overflow。要格式化帖子中的代码,您可以在单独的段落上给它加上四个空格前缀,或者在它们之间加上反引号(`` ...'')。您不需要<code><pre>标签。我在这种想法下编辑了您的答案。
圣保罗Ebermann

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>产生警告。


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)

史蒂夫·B(Steve B)的建议(代码3)似乎给出了最好的结果,即使按了Alt + Shift + F,仍然保持了预期的格式。

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

(代码3)

使用代码3会产生与图1相同的javadoc HTML输出。


4

这是我的两分钱。

正如其他答案已经指出的那样,您应该<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),它可以正确呈现。


3

<blockquote><pre>...和之间有显着差异<pre>{@code....前者将省略类型声明仿制药,但后者会继续使用它。

E.g.: List<MyClass> myObject = null; 显示为List myObject = null;与firts并作为List<MyClass> myObject = null;与所述第二


2

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

<pre class=”prettyprint”>

TODO:your code.

</pre>

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


1
请说明:考虑到需要@code标记的问题,Android工具中的哪些工具可以实现此目的?哪个组件应该定义prettyprint类?Android使用常规Javadoc。
noamtm

Xamarin / VS,Android Studio还是没关系?
tyblu

@tyblu Android Studio可以,但是Xamarin Studio / VS可能不起作用。您可以尝试一下。
ifeegoo

1

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


1

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

 /** 
 * Bla bla bla, for example:
 *
 * <pre>
 * void X() {
 *    List{@code <String>} a = ...;
 *    ...
 * }
 * </pre>
 *
 * @param ...
 * @return ...
 */
 .... your code then goes here ...

0

我用<pre class="brush: java"></pre>标记将示例代码括起来,并将SyntaxHighlighter用于已发布的javadocs。它不会损害IDE,并使发布的代码示例漂亮。



使用语法荧光笔,您必须加载脚本并更正CSS。看起来很棒,但是您必须为所需的脚本和CSS输入正确的路径。另外,如果希望离线使用,则必须注意正确的路径。
亚历克斯·伯斯

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

这将产生与常规代码完全相似的输出,并保留常规代码间距和换行符。


2
这不会为现有答案添加任何内容。
madth3 2012年

madth3,您是对的。我以为使用lower和.uppercase前置修饰符会有所区别,但是从第二个角度看,它看起来并不像。它可能也与它在此网页上的显示方式以及在Javadoc中的显示方式有关。
Eugene_CD-adapco 2012年

1
html标签中是否区分大小写?
Jasonw

0

至少在Visual Studio Code中,您可以通过将Javadoc注释包装在三个反引号中来强制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.
 ``` */
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.