1. 概述

在这个教程中,我们将探讨格式化Javadoc注释的不同方法。我们的重点将放在分析作为文档注释编写的代码片段的格式。

2. 引言

Javadoc是为Java类生成文档的工具。它处理Java源文件中指定的文档注释,并生成相应的HTML页面

要了解更多关于Javadoc文档的信息,请参考我们的文章:Javadoc文档指南

3. 代码片段作为Javadoc注释

我们可以在Java类的文档注释中包含代码片段。我们希望在生成的HTML页面上看到代码片段带有正确的缩进和字符。

让我们尝试在注释中添加一个Java代码片段:

/**
* This is an example to show default behavior of code snippet formatting in Javadocs
* 
* public class Application(){
* 
* }
* 
*/

对应的HTML页面:

默认Javadoc

默认情况下,Javadoc评论中不保留换行符和空格,导致多行代码片段的缩进出现问题。

让我们找到一种方法来保持注释中的正确缩进。

3.1. 使用<pre>标签

HTML提供了<pre>标签来表示预格式化的文本。它保留所包含文本的空格和换行符,从而保留代码片段所需的适当缩进:

/**
* This is an example to show usage of HTML pre tag while code snippet formatting in Javadocs
* 
* <pre>
* public class Application(){
*     List<Integer> nums = new ArrayList<>();
* }
* 
* </pre>
*/

对应的HTML页面:

使用PRE的Javadoc

现在,我们成功地保留了代码片段所需的空格和换行。然而,我们遇到了一个新的问题:我们无法看到代码片段中包含的[Generics](/java-generics)部分。

由于注释被解析为HTML页面,代码片段的部分可能会被误识别为HTML标签,如上述示例中的<Integer>

让我们探索如何在注释中保持HTML字符的正确格式。

3.2. 使用HTML字符实体

如果我们的代码片段包含HTML保留字符,如'*<*''*>*''*&*',这些在解析注释时可能会被识别为HTML字符。为了保留这些字符,我们可以使用字符实体代替所需的字符

例如,我们可以使用&lt;表示'*<*'字符:

/**
* This is an example to show usage of HTML character entities while code snippet formatting in Javadocs
* 
* <pre>
* public class Application(){
*     List&lt;Integer&gt; nums = new ArrayList<>();
* }
* 
* </pre>
*/

对应的HTML页面:

使用字符实体的Javadoc

3.3. 使用@code标签

Javadoc提供了@code标签,它将嵌入括号内的注释视为源代码而不是HTML字符。这使我们能够直接使用HTML保留字符,而无需使用字符实体进行转义:

/**
* This is an example to show usage of javadoc code tag while code snippet formatting in Javadocs
* 
* <pre>
* 
* public class Application(){
*     {@code List<Integer> nums = new ArrayList<>(); }
* }
*
* </pre>
*/

对应的HTML页面:

使用code标签的Javadoc

请注意,@code标签并未解决我们注释中的缩进问题。为此,我们需要额外使用<pre>标签。

正如我们所见,Javadoc通过识别以*@*开头的标签。如果我们的代码片段包含*@*,Javadoc会错误地解析它们,导致注释渲染不正确。

让我们通过一个例子来看这个问题:

/**
* This is an example to show issue faced while using annotations in Javadocs
* 
* <pre>
* 
* public class Application(){
*            @Getter
*     {@code List<Integer> nums = new ArrayList<>(); }
* }
*
* </pre>
*/

对应的HTML页面:

Javadoc注解问题

我们可以看到,Javadoc将@Getter识别为一个标签,导致注释未能正确渲染。我们可以将注解(或使用@字符的代码)嵌入Javadoc提供的@code标签内

/**
* This is an example to show usage of javadoc code tag for handling '@' character
* 
* <pre>
* 
* public class Application(){
*     {@code @Getter}
*     {@code List<Integer> nums = new ArrayList<>(); }
* }
*
* </pre>
*/

对应的HTML页面:

使用注解的code标签的Javadoc

3.4. 使用@literal标签

我们也可以通过使用@literal标签实现类似的效果。@code标签和@literal标签之间的主要区别在于,@code标签将括号内的内容以代码字体格式显示:

/**
* This is an example to show difference in javadoc literal and code tag
* 
* <p>
* 
* {@literal @Getter}
* {@literal List<Integer> nums = new ArrayList<>(); }
*   
* <br />
* {@code @Getter}
* {@code List<Integer> nums = new ArrayList<>(); }
* </p>
*/

对应的HTML页面:

literal vs code标签的Javadoc

这样,我们就可以在HTML页面上正确显示代码片段了。

3.5. 格式化jQuery代码片段

到目前为止,我们以Java代码片段为例。对于其他语言,同样的功能同样适用。

让我们在文档注释中包含一个简单的jQuery代码片段:

/**
* This is an example to illustrate a basic jQuery code snippet embedded in documentation comments
* <pre>
* {@code <script>}
* $document.ready(function(){
*     console.log("Hello World!);
* })
* {@code </script>}
* </pre>
*/

对应的HTML页面:

Javadoc jQuery代码

3.6. 格式化HTML代码片段

到目前为止,我们了解到Javadoc一方面允许我们使用HTML标签来格式化注释,另一方面在我们需要在不带标记的情况下使用HTML字符时也可能引发问题。

例如,我们可能想要在注释中插入HTML代码片段。让我们在注释中插入一个HTML代码片段来看看它的表现:

/**
* This is an example to illustrate an HTML code snippet embedded in documentation comments
* <pre>
* <html>
* <body>
* <h1>Hello World!</h1>
* </body>
* </html>
* </pre>
* 
*/

对应的HTML页面:

嵌入HTML代码片段的Javadoc

在这里,我们看到嵌入在注释中的代码片段被解析为带有HTML标记的HTML页面。我们可以使用上述的@code标签来解决这个问题:

/**
* This is an example to illustrate an HTML code snippet embedded in documentation comments
* <pre>{@code
* <html>
* <body>
* <h1>Hello World!</h1>
* </body>
* </html>}
* </pre>
* 
*/

对应的HTML页面:

修复后的HTML代码片段的Javadoc

4. 总结

我们已经探讨了格式化Javadoc注释的不同方法。根据需求,我们可以选择合适的格式选项来生成格式良好的文档

我们可以利用HTML标签增强Javadoc注释的格式,并在需要时对其进行转义。