ChatGPT解决这个技术问题 Extra ChatGPT

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


b
bb216b3acfd8f72cbc8f899d4d6963

除了已经提到的 <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 中可用的标记描述的完整列表。


我也会这么认为,但不幸的是它没有,你仍然需要添加
 标签来获得换行符。
                        				                   		
不幸的是,当您点击 ctrl+shift+F(在 Eclipse 中格式化代码)时,Eclipse 会弄乱 {@code} 标签并将其替换为 {@code ...
@jpdaigle 我刚刚在 Eclipse Galileo 和 Helios 中尝试过这个,格式化程序并没有取代我的任何东西(在 Mac OS 上,但我也从未见过格式化程序在其他平台上做类似的事情)。
另一个不幸的是,如果您的示例代码中有使用大括号“{}”的块,则第一个右大括号将终止 @code 块。解决它的一种方法是使用(等待它......) html 实体作为大括号。对于带有块的代码,我没有看到一个令人信服的论点。
Eclipse 弄乱了 {@code} 标记并将其替换为 {@code- 这不是因为 Eclipse,这是因为(错误?)javadoc 实用程序。如果您在 {@code ...multiline...} 内的多行代码中有 @ 字符,则 javadoc 无法正确解析它:(至少这是我在 Oracle JDK1.7.0_45 javadoc 实现中看到的。
l
leventov

在 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();

这可行,但是在运行 javadoc 输出此警告“警告: 内的 {@code}”时我收到警告
这是一个有效的方法,接受的答案在我的日食(4.6.2)中效果不佳。
我想知道为什么所有这些都是必要的,我的 intellij 13 及更高版本可以很好地使用已接受答案中的代码。这只是一个日食问题吗?
是的,我在 IntelliJ 11 及更高版本中也看到了这项工作。 IntelliJ 正确处理它。不幸的是,Eclipse 没有正确呈现 JavaDoc(悬停状态),并且忽略了新行和 html 中断。我正在尝试找到一个在这两个 IDE 中都运行良好的解决方案,因为它们是当今使用的两个顶级 IDE。
S
Steve B.

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>
@JinKwon 遗憾的是,这并不总是有效,而不是在我的代码片段中 :( 在开头添加一个 {@code 有效,即使无法达到结束 }
这似乎适用于大多数代码,但不能转义尖括号,例如 List<String>。为此,我使用 <pre>{@code ... }</pre>
如果文档本身包含 },@Daniel 将不起作用。这个右花括号将结束 {@code ...}
Z
Zach Scrivena

<pre></pre> 标记将您的多行代码括起来。


P
Paŭlo Ebermann

您需要 <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> 中使用大括号。堵塞...
J
Jin Kwon
/**
 * <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> 包围会产生警告。


M
MC Emperor

这是我的两分钱。

正如其他答案已经说明的那样,您应该将 <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)它被正确呈现。


b
bitsdanceforme

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


T
Tamas

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

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


m
mljrg

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

令人惊讶的是,这还不够投票!这解决了我的问题,因为同时使用“边到边”导致代码的第一个右括号匹配为 {@code.感谢分享。
u
user1050755

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

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

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

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


i
ifeegoo

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

<pre class=”prettyprint”>

TODO:your code.

</pre>

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


请解释一下:考虑到需要@code 标签的问题,Android 工具中的哪些内容应该可以完成这项工作?哪个组件应该定义 prettyprint 类? Android 使用常规的 Javadoc。
Xamarin/VS,Android Studio,还是没关系?
@tyblu Android Studio 可以,但是 Xamarin Studio/VS 可能不行。你可以试试。
N
Nolequen

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

E
Edwin

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


M
Manuel Jordan

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

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

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

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


J
Jarek Przygódzki

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


使用语法荧光笔,您必须加载脚本并更正 css。看起来很神奇,但您必须将正确的路径放入所需的脚本和 css。此外,如果希望离线使用,必须注意正确的路径。
E
Eugene_CD-adapco

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

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


这不会为现有答案添加任何内容。
madth3,你是对的。我以为我在使用 lower 和 UPPERCASE 前置修饰符时看到了不同,但再看一遍,它看起来不像。它也可能与它在此网页上的显示方式与它在 javadoc 中的显示方式有关。
html标签区分大小写?
V
Venryx

至少在 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.
 ``` */