1. 概述

Javadoc 是一种从 Java 源代码生成 HTML 格式文档的工具。本文将重点探讨文档注释中的 @version@since 这两个注解的使用方法。

2. @version 和 @since 的使用

本节将详细说明如何正确使用这两个注解。

2.1 @version

@version 注解的格式非常简单:

@version version-text

例如,用它标注 JDK 1.7:

/**
 * @version JDK 1.7
 */

@version 有两种典型使用场景:

  • 记录单个文件的版本
  • 标记整个软件的版本

这两种场景存在明显差异:单个文件版本可能与软件版本不兼容,且不同文件的版本可能各不相同。那么该如何使用呢?

过去 Sun 公司用 @version 记录单个文件版本,建议使用 SCCS 字符串 %I%, %G%。SCCS 会在检出文件时将 %I% 替换为文件当前版本号,%G% 替换为日期(格式 mm/dd/yy),例如 1.39, 02/28/97。每次编辑并执行 delget(增量获取)操作时,%I% 会自动递增。

SCCS(Source Code Control System)是老古董级版本控制系统(IBM 文档参考)。

现在我们更倾向于用 @version 标记整个软件版本,这使得放在单个文件里的 @version 显得多余。这是否意味着单个文件版本不再重要?并非如此——现代版本控制系统(如 Git/SVN/CVS)有自己记录文件版本的方式,无需依赖 @version

以 Oracle JDK 8 为例,查看 src.zip 会发现只有 java.awt.Color 类使用了 @version

/**
 * @version     10 Feb 1997
 */

可见用 @version 标记文件版本的做法正在淘汰。因此 Oracle 官方文档 建议用 @version 记录软件当前版本号。

2.2 @since

@since 注解的格式同样简单:

@since since-text

例如,标注 JDK 1.7 引入的特性:

/**
 * @since JDK 1.7
 */

@since 用于描述变更或特性首次出现的版本,同样指软件发布版本而非文件版本。Oracle 官方文档 给出详细使用指南:

  • 引入新包时,应在包描述和每个类中添加 @since
  • 添加新类/接口时,只需在类描述中添加(不必在成员中)
  • 向现有类添加新成员时,只需在新成员中添加 @since
  • 后续版本中将成员从 protected 改为 public 时,不应修改 @since

@since 能为用户提供重要提示:特定功能仅在特定版本后可用。查看 JDK 源码会发现大量使用案例,例如 java.lang.FunctionalInterface

/**
 * @since 1.8
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

这段代码明确表示 FunctionalInterface 仅在 JDK 8+ 可用。

3. @version 和 @since 的共同点

这两个注解存在几个关键相似点。

3.1 同属块标签

两者都属于块标签(Block Tags)

文档注释的标签分两类:

  • 块标签
  • 行内标签

块标签格式为 @tag,必须出现在行首(忽略前导星号、空格和分隔符 /**)。例如:

/**
 * Some description here.
 * 
 * @version 1.2
 * @since 1.1
 */

行内标签格式为 {@tag},可出现在描述的任意位置。例如 {@link}

/**
 * We can use a {@link java.lang.StringBuilder} class here.
 */

3.2 都可重复使用

两者都允许多次使用。这个特性可能让人意外——一个类里出现多个 @version?但这是官方文档明确支持的:因为同一程序元素可能属于多个 API。

例如当同一类用于 ADK 和 JDK 不同版本时:

/**
 * Some description here.
 *
 * @version ADK 1.6
 * @version JDK 1.7
 * @since ADK 1.3
 * @since JDK 1.4
 */

生成的 HTML 文档中,Javadoc 工具会用逗号+空格分隔多个值:

ADK 1.6, JDK 1.7
ADK 1.3, JDK 1.4

4. @version 和 @since 的差异

4.1 内容是否变化

@version 内容持续变化,@since 内容稳定。随着软件迭代,版本号会不断更新;而 @since 标记的是历史时间点,一旦确定就不再修改。

4.2 使用范围差异

两者的适用范围不同:

  • @version:概览页、包、类、接口
  • @since:概览页、包、类、接口、字段、构造方法、普通方法

@since 适用范围更广,可用于任何文档注释,而 @version 无法用于字段、构造方法和方法。

4.3 默认显示行为

两者在生成 HTML 时的默认行为不同:

  • @version 默认不显示
  • @since 默认显示

想显示版本信息需加 -version 选项

javadoc -version -d docs/ src/*.java

想隐藏 @since 信息需加 -nosince 选项

javadoc -nosince -d docs/ src/*.java

5. 总结

本文详细讲解了 @version@since 的正确使用方式,并对比了它们的异同。简单来说:

  • @version 用于记录软件当前版本号
  • @since 用于标记特性或变更首次出现的版本

合理使用这两个注解,能让你的 API 文档更专业、更易维护。实际开发中建议优先使用 @since,而 @version 则根据团队规范谨慎使用——毕竟现代版本控制系统已经能更好地管理版本信息了。


原始标题:Javadoc: @version and @since