Java 文档注释(学习 Java 编程语言 038)

JDK 包含一个很有用的工具,叫做 javadoc, 它可以由源文件生成一个 HTML 文档。Java 的 API 文档就是通过标准 Java 类库的源代码运行 javadoc 生成的。

如果在源代码中添加以专用的定界符 /** 开始的注释,可以很容易地生成一个看上去具有专业水准的文档。这是一种很好的方式,因为这种方式可以将代码与文档注释放在一个地方。如果将文档注释放在一个独立的文件中,就有可能会随着时间的推移出现代码和文档注释不一致的问题。然而,由于文档注释与源代码在同一个文件中,在修改源代码的同时,重新运行 javadoc 就可以轻而易举地保持两者的一致性。

1. 注释的插入

javadoc 实用工具从下面几项中抽取信息:
 • 模块
 • 包
 • 公共类和接口
 • 公共的和受保护的字段
 • 公共的和受保护的构造器和方法
可以(而且应该)为以上各个特性编写注释。注释放置在所描述特性的前面。注释一个 /** 开始,并以 */ 结束。

每个 /** ... */ 文档注释包含标记以及之后紧跟着自由格式文本(free-form text)。标记以 @ 开始,如 @since@param

自由格式文本的第一句应该是一个概要性的句子。javadoc 工具自动地将这些句子抽取出生成概要页。

在自由格式文本中,可以使用 HTML 修饰符,例如:

  • 用于强调 <em>...</em>
  • 用于着重强调<strong>...</strong>
  • 用户项目符号列表的 <ul>/<li>
  • 用于包含图像的 <img ...>
  • 用于等宽代码 {@code ...}, 而不是 <code>...</code> —— 这样一来,就不用操心对代码中的 < 字符转移了。

注释:如果文档中有到其他文件的链接,如图像文件(例如,图标或用户界面组件的图像),就应该将这些文件放到包含源文件的目录下的一个子目录 doc-files 中。javadoc 工具将从源目录将 doc-files 目录及其内容拷贝到文档目录中。在链接中需要使用 doc-files 目录,例如:<img src="doc-files/uml_png" alt="UML diagram" >

2. 类注释

类注释必须放在 import 语句之后,类定义之前。

下面是一个类注释的例子:

/**
 * A {@code Card} object represents a playing card, such
 * as "Queen of Hearts". A card has a suit (Diamond, Heart,
 * Spade or Club) and a value (1 = Ace, 2 . . . 10, 11 = Jack,
 * 12 = Queen, 13 = King)
 */
public class Card{
    ...
}

没有必要在每一行的开始用星号 *, 例如, 以下注释同样是合法的:

/**
 A {@code Card} object represents a playing card, such
 as "Queen of Hearts". A card has a suit (Diamond, Heart,
 Spade or Club) and a value (1 = Ace, 2 . . . 10, 11 = Jack,
 12 = Queen, 13 = King)
 */
public class Card{
    ...
}

3. 方法注释

每一个方法注释必须放在所描述的方法之前。除了通用标记之外,还可以使用下面的标记:

  • @param variable description(变量描述)

    这个标记将对当前方法的 “parameters” (参数)部分添加一个条目。这个描述可以占据多行,并可以使用 HTML 标记。一个方法的所有 @param 标记必须放在一起。

  • @return description(描述)

    这个标记将对当前方法添加 “returns” (返回)部分。这个描述可以跨越多行,并可以使用 HTML 标记。

  • @throws class description(类描述)

    这个标记将添加一个注释,用于表示这个方法有可能抛出异常。

下面是一个合法注释示例:

    /**
     * Raises the salary of an employee.
     * @param byPercent the percentage by which to raise the salary (e.g. 10 means 10%)
     * @return the amount of the raise
     */
    public double raiseSalary(double byPercent) {
        double raise = salary * byPercent / 100;
        salary += raise;
        return raise;
    }

4. 字段注释

只需要对公有字段(通常指的是静态常量)建立文档。

    /**
     * The "Hearts" card suit
     */
    public static final int HEARST = 1;

5. 通用注释

5.1 用在类文档注释的标记

  • @author 姓名

    这个标记将产生一个 “author” (作者)条目。可以使用多个 @author 标记,每个 @author 标记对应一个作者。并不是非得使用这个标记,你的版本控制系统能够更好地跟踪作者。

  • @version 文本

    这个标记将产生一个 “version”(版本)条目。这里的文本可以是对当前版本的任何描述。

5.2 可以用在所有文件注释的标记

  • @since 文本

    这个标记将产生一个 “since” (始于)条目。这里的 text 可以是对引入这个特性的版本的任何描述。例如, @since 1.7.1

  • @deprecated 文本

    这个标记将对类、方法或变量添加一个不再使用的注释。文本中给出了取代的建议。例如,
    @deprecated Use <code>setVIsible(true)</code> instead
    通过 @see 和 @link 标记, 可以使用超级链接, 链接到 javadoc 文档的相关部分或外部文档。

  • @see 引用

    这个标记将在 “see also” 部分增加一个超级链接。它可以用于类中,也可以用于方法中。这里的 reference(引用)可以有以下选择:
     1. package.class#feature label
     2. <a href="...">label/a>
     2. "text"
    第一种情况是最有用。只要提供类、方法或变量的名字,javadoc 就在文档中插入一个超链接。例如,
    @see com.xiang117.corejava.Employee#raiseSalary(double)
    会建立一个链接到 com.horstmann.corejava.Employee 类的 raiseSalary(double) 方法的超链接。可以省略包名,甚至把包名和类名都省去,这样一来,这会定位于当前包或当前类中。
    需要注意,一定要使用井号(#),而不要使用点号(.)分隔类名与方法名,或类名与变量名。Java 编译器自身可以熟练地确定点号在分隔包、子包、类、内部类与方法和变量时的不同含义。但是 javadoc 工具就没有这么聪明了,因此必须对它提供帮助。

    如果 @see 标记后面有一个 < 字符,就需要指定一个超链接。可以超链接到任何 URL。例如:
    @see <a href="www.xiang117.com/corejava.html">The Core Java home page</a>
    @see <a href="http://www.baidu.com">百度</a>
    在上述各种情况下,都可以指定一个可选的标签(label)作为链接锚(link anchor)。如果省略了标签,用户看到的锚就是目标代码名或 URL。

    如果 @see 标记后面有一个双引号(")字符,文本就会显示在 “see also” 部分。例如,
    @see "Core Java 2 volume 2"

    可以为一个特性添加多个 @see 标记,但必须将它们放在一起。

  • @link

    如果愿意,还可以在文档注释中的任何位置放置指向其他类或方法的超链接,可以在注释中的任何位置插入一个形式如下的特殊标记:
    {@link package.class#feature label}
    这里的特性描述规则与 @see 标记规相同。

  • @index

    在 Java 9 中,还可以使用 {@index entry} 标记为搜索框增加一个条目。

6. 包注释

可以直接将类、方法和变量的注释放置在 Java 源文件中,只要用 /** . . . */ 文档注释界定就可以了。但是,要想产生包注释,就需要在每一个包目录中添加一个单独的文件。可以有如下两个选择:

  1. 提供一个名为 package-info.java 的 Java 文件。这个文件必须包含一个初始的以 /***/ 界定的 Javadoc 注释,后面是一个 package 语句。它不应该包含更多的代码或注释。
  2. 提供一个名为 package.html 的 HTML 文件。会抽取标记 <body>...</body>之间的所有文本。

7. 注释抽取

假设希望 HTML 文件将放在名为 docDirectory 的目录下。执行以下步骤:

  1. 切换到包含想要生成文档的源文件的目录。如果有嵌套的包要生成文档,例如 com.
    xiang117.corejava, 就必须切换到包含子目录 com 的目录(如果提供了 overview.html 文件的
    话,这就是这个文件所在的目录)。
  2. 如果是一个包,应该运行命令:
    javadoc -d docDirectory nameOfPackage
    如果要为多个包生成文档,运行:
    javadoc -d docDirectory nameOfPackage1 nameOfPackage2
    如果文件在无名的包中,就应该运行:
    javadoc -d docDirectory *.java

如果省略了 -d docDirectory 选项,那 HTML 文件就会被提取到当前目录下。这样有可能会带来混乱,因此不提倡这种做法。

可以使用很多命令行选项对 javadoc 程序进行优化。例如,可以使用 -author 和 -version 选项在文档中包含 @author 和 @version 标记(默认情况下,这些标记会被省略 )。另一个很有用的选项是 -link,用来为标准类添加超链接。例如,如果使用命令
javadoc -link http://docs.oracle.com/javase/9/docs/api *.java
那么,所有的标准类库类都会自动地链接到 Oracle 网站的文档。

如果使用 -linksource 选项,则每个源文件将会被转换为 HTML (不对代码着色,但包含行号),并且每个类和方法名将变为指向源代码的超链接。

还可以为所有的源文件提供一个概要注释。把它放在一个类似 overview.html 的文件中,运行 javadoc 工具,并提供命令行选项 -overview filename。将抽取标记 <body>...</body> 之间的所有文本。当用户长导航栏中选择 “Overview”(概览)时,就会显示出这些内容。

有关其他的选项,请查阅 javadoc 工具的联机文档 https://docs.oracle.com/javase/9/javadoc/javadoc.htm

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容