Thinking in Java 4 : 注释和嵌入文档

Java 里有两种类型的注释,第一种是传统的、 C 语言风格的注释,是从 C++继承而来的。这些注释用一个“ /”起头,随后是注释内容,并可跨越多行,最后用一个“ /”结束。

注意:许多程序员在连续注释内容的每一行都用一个“ *”开头,所以经常能看到象下面这样的内容:

/* 这是
 * 一段注释,
 * 它跨越了多个行
*/

但请记住,进行编译时,/*和*/之间的所有东西都会被忽略,所以上述注释与下面这段注释并没有什么不同:

/* 这是一段注释,
它跨越了多个行 */

第二种类型的注释也起源于 C++。这种注释叫作“单行注释”,以一个“ //”起头,表示这一行的所有内容都是注释。

这种类型的注释更常用,因为它书写时更方便。没有必要在键盘上寻找“ /”, 再寻找“ *”(只需按同样的键两次),而且不必在注释结尾时加一个结束标记。下面便是这类注释的一个例子:

// 这是一条单行注释

1 注释文档

对于 Java 语言,程序的文档化,最大的问题莫过于对文档的维护。解决的方法就是将代码同文档“链接”起来,为达到这个目的,最简单的方法是将所有内容都置于同一个文件,然而,为使一切都整齐划一,还必须使用一种特殊的注释语法,以便标记出特殊的文档;另外还需要一个工具,用于提取这些注释,并按有价值的形式将其展现出来。

用于提取注释的工具叫作 javadoc,它 输出的是一个 HTML 文件,我们能轻松获得所有 Java 库的文档。

2 具体语法

所有 javadoc 命令都只能出现于“ /**”注释中。但和平常一样,注释结束于一个“ */”。主要通过两种方式来使用 javadoc:嵌入的HTML,或使用“文档标记”。其中,“文档标记”( Doc tags)是一些以“ @”开头的命令,置于注释行的起始处(但前导的“ *”会被忽略)。

有三种类型的注释文档,它们对应于位于注释后面的元素:类、变量或者方法。也就是说, 一个类注释正好位于一个类定义之前;变量注释正好位于变量定义之前;而一个方法定义正好位于一个方法定义的前面。


下面这个简单的例子所示:

/** 一个类注释 */
public class DocTest {
   /** 一个变量注释 */
  public int i;
  /** 一个方法注释 */
  public void f() {}
}

注意 javadoc 只能为 public(公共)和 protected(受保护)成员处理注释文档,因为只有 public 和 protected 成员才可在文件之外使用,然而,所有类注释都会包含到输出结果里。

3 嵌入 H T M L

javadoc 将 HTML 命令传递给最终生成的 HTML 文档。这便使我们能够充分利用 HTML 的巨大威力。当然,我们的最终动机是格式化代码,不是为了哗众取宠。下面列出一个例子:

/**
* <pre>
* System.out.println(new Date());
* </pre>
*/

亦可象在其他 Web 文档里那样运用 HTML,对普通文本进行格式化,使其更具条理、更加美观:

/**
* 您<em>甚至</em>可以插入一个列表:
* <ol>
* <li> 项目一
* <li> 项目二
* <li> 项目三
* </ol>
*/

注意在文档注释中,位于一行最开头的星号会被 javadoc 丢弃,同时丢弃的还有前导空格; javadoc 会对所有内容进行格式化,使其与标准的文档外观相符,不要将h1或hr这样的标题当作嵌入 HTML 使用,因为javadoc 会插入自己的标题,我们给出的标题会与之冲撞。

所有类型的注释文档—类、变量和方法— 都支持嵌入 HTML。

4 @ s e e :引用其他类

所有三种类型的注释文档都可包含@see 标记,它允许我们引用其他类里的文档。对于这个标记, javadoc 会生成相应的 HTML,将其直接链接到其他文档。格式如下:

@see 类名
@see 完整类名
@see 完整类名#方法名

每一格式都会在生成的文档里自动加入一个超链接的“ See Also”条目。注意 javadoc 不会检查我们指定的超链接,不会验证它们是否有效。

5 类文档标记

随同嵌入 HTML 和@see 引用,类文档还可以包括用于版本信息以及作者姓名的标记。类文档亦可用于“接口”目的(本书后面会详细解释)。

1. @version

格式如下:

@version 版本信息

其中,“版本信息”代表任何适合作为版本说明的资料。若在 javadoc 命令行使用了“ -version”标记,就会从生成的 HTML 文档里提取出版本信息。

2. @author

格式如下:

@author 作者信息

其中,“作者信息”包括您的姓名、电子函件地址或者其他任何适宜的资料。若在javadoc 命令行使用了“ -author”标记,就会专门从生成的 HTML 文档里提取出作者信息。

6 变量文档标记

变量文档只能包括嵌入的 HTML 以及@see 引用。

7 方法文档标记

除嵌入 HTML 和@see 引用之外,方法还允许使用针对参数、返回值以及违例的文档标记。

1. @param

格式如下:

@param 参数名 说明

其中,“参数名”是指参数列表内的标识符,而“说明”代表一些可延续到后续行内的说明文字。一旦遇到一个新文档标记,就认为前一个说明结束。可使用任意数量的说明,每个参数一个。

2. @return

格式如下:

@return 说明

其中,“说明”是指返回值的含义。它可延续到后面的行内。

3. @exception

简言之,它们是一些特殊的对象,若某个方法失败,就可将它们“扔出”对象。调用一个方法时,尽管只有一个违例对象出现,但一些特殊的方法也许能产生任意数量的、不同类型的违例。所有这些违例都需要说明。所以,违例标记的格式如下:

@exception 完整类名 说明

其中,“完整类名”明确指定了一个违例类的名字,它是在其他某个地方定义好的。而“说明”(同样可以
延续到下面的行)告诉我们为什么这种特殊类型的违例会在方法调用中出现。

4. @deprecated

该标记用于指出一些旧功能已由改进过的新功能取代。该标记的作用是建议用户不必再使用一种特定的功能,因为未来改版时可能摒弃这一功能。若将一个方法标记为@deprecated,则使用该方法时会收到编译器的警告。

8 文档示例

下面还是我们的第一个 Java 程序,只不过已加入了完整的文档注释:

import java.util.Date;
import java.util.Properties;

/**
 * The first Thinking in Java example program. 
 * Lists system information on current machine.
 * 
 * @author Bruce Eckel
 * @author http://www.BruceEckel.com
 * @version 1.0
 */
public class Property {
    /**
     * Sole entry point to class & application
     * 
     * @param args
     *            array of string arguments
     * @return No return value
     * @exception exceptions
     *                No exceptions thrown
     */
    public static void main(String[] args) {
        System.out.println(new Date());
        Properties p = System.getProperties();
        p.list(System.out);
        System.out.println("--- Memory Usage:");
        Runtime rt = Runtime.getRuntime();
        System.out.println("Total Memory = " + rt.totalMemory() 
                        + " Free Memory = " + rt.freeMemory());
    }
}
读者评论 前言 简介 第1章 对象导论 1.1 抽象过程 1.2 每个对象都有一个接口 1.3 每个对象都提供服务 1.4 被隐藏的具体实现 1.5 复用具体实现 1.6 继承 1.6.1 “是一个”(is-a)与“像是一个”(is-like-a)关系 1.7 伴随多态的可互换对象 1.8 单根继承结构 1.9 容器 1.9.1 参数化类型(范型) 1.10 对象的创建和生命期 1.11 异常处理:处理错误 1.12 并发编程 1.13 Java与Internet 1.13.1 Web是什么 1.13.2 客户端编程 1.13.3 服务器端编程 1.22 总结 第2章 一切都是对象 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.2.1 存储到什么地方 2.2.2 特例:基本类型 2.2.3 Java中的数组 2.3 永远不需要销毁对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 创建新的数据类型:类 2.4.1 域和方法 2.4.2 基本成员默认值 2.5 方法、参数和返回值 2.5.1 参数列表 2.6 构建一个Java程序 2.6.1 名字可见性 2.6.2 运用其他构件 2.6.3 static 关键字 2.7 你的第一个J ava程序 编译和运行 2.8 注释嵌入文档 2.8.1 注释文档 2.8.2 语法 2.8.3 嵌入式HTML 2.8.4 一些标签示例 2.8.5 文档示例 2.9 编码风格 2.10 总结 2.11 练习 第3章 操作符 3.1 更简单的打印语句 3.2 使用Java操作符 3.3 优先级 3.4 赋值 3.4.1 方法调用中的别名问题 3.5 算术操作符 3.5.1 一元加、减操作符 3.6 自动递增和递减 3.7 关系操作符 3.7.1 测试对象的等价性 3.8 逻辑操作符 3.8.1 短路 3.9 直接常量 3.9.1 指数记数法 3.10 按位操作符 3.11 移位操作符 3.12 三元操作符 if-else 3.13 字符串操作符 + 和 += 3.14 使用操作符时常犯的错误 3.15 类型转换操作符 3.15.1 截尾和舍入 3.15.2提升 3.16 Java没有“sizeof” 3.17 操作符小结 3.18 总结 第4章 控制执行流程 4.1 true和false 4.2 if-else 4.3 迭代 4.3.1 do-while 4.3.2 for 4.3.3 逗号操作符 4.4 Foreach语法 4.5 return 4.6 break和 continue 4.7 臭名昭著的“goto” 4.8 switch 4.9 总结 第5章 初始化与清理 5.1 用构造器确保初始化 5.2 方法重载 5.2.1 区分重载方法 5.2.2 涉及基本类型的重载 5.2.3 以返回值区分重载方法 5.3 缺省构造器 5.4 this关键字 5.4.1 在构造器中调用构造器 5.4.2 static的含义 5.5 清理:终结处理和垃圾回收 5.5.1 finalize()的用途何在 5.5.2 你必须实施清理 5.5.3 终结条件 5.5.4 垃圾回收器如何工作 5.6 成员初始化 5.6.1 指定初始化 5.7 构造器初始化 5.7.1 初始化顺序 5.7.2. 静态数据的初始化 5.7.3. 显式的静态初始化 5.7.4. 非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 第7章 复用类 第8章 多态 第9章 接口 第10章 内部类 第11章 持有对象 第12章 通过异常处理错误 第13章 字符串 第14章 类型信息 第15章 泛型 第16章 数组 第17章 容器深入研究 第18章 Java I/O系统 第19章 枚举类型 第20章 注解 第21章 并发 第22章 图形化用户界面 附录A 补充材料 可下载的补充材料 Thinking in C:Java的基础 Java编程思想 研讨课 Hands-on Java研讨课CD Thinking in Objects研讨课 Thinking in Enterprise Java Thinking in Patterns(with Java) Thinking in Patterns研讨课 设计咨询与复审 附录B 资源 软件 编辑器与IDE 书籍 分析与设计 Python 我的著作列表 索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值