7.1 命名和大小写约定

下述广泛采用的命名约定适用于 Java 中的包、引用类型、方法、字段和常量。这些约定几乎全球通用,而且会影响你定义的类的公开 API,因此要认真遵守。

公开可见的包通常要尽量使用唯一的包名。十分常见的做法是,把网站的域名倒过来,放在包名前(例如 com.oreilly.javanutshell)。所有包名都应该使用小写字母。

如果包只在应用内部使用,而且打包成 JAR 文件分发,那么这种包公开不可见,无需遵守上述约定。此时,经常使用应用的名称作包名或包名的前缀。

  • 引用类型

类型的名称应该以大写字母开头,而且要混用大小写(例如 String)。如果类名包含多个单词,每个单词的第一个字母都要大写(例如 StringBuffer)。如果类型名称或类型名称中有一部分是简称,那么简称可以全用大写字母(例如 URLHTMLParser)。

类和枚举类型是为了表示对象,因此类名要使用名词(例如 ThreadTeapotFormatConverter)。

如果接口是用来为实现这个接口的类提供额外信息的,那么一般应该使用形容词命名这个接口(例如 RunnableCloneableSerializable)。注解类型一般也使用这种命名方式。

如果接口的作用更像是抽象超类,那么应该使用名词命名(例如 DocumentFileNameMapCollection)。

  • 方法

方法名始终以小写字母开头。如果方法名包含多个单词,除第一个单词外,其他单词的第一个字母都要大写(例如 insert()insertObject()insertObjectAt())。这种命名方式一般称为“驼峰式”。

方法名一般都经过精心挑选,让第一个单词为动词。为了清楚表明方法的作用,方法名的长度不限,但应该尽量选择简短的名称。应该避免使用太通用的方法名,例如 performAction()go() 或糟透的 doIt()

  • 字段和常量

非常量字段的名称使用的大小写约定和方法名一样。如果是声明为 static final 的常量,其名称应该使用全大写形式。如果常量的名称包含多个单词,单词之间应该使用下划线分隔(例如 MAX_VALUE)。为字段选择的名称,应该最能说明字段或其值的作用。枚举类型定义的常量往往也全部使用大写字母。

  • 参数

方法的参数使用的大小写约定和非常量字段一样。方法的参数名会出现在方法的文档中,因此应该选择一个能尽量清楚表明参数作用的名称。尽量使用一个单词命名参数,并在所有用到这个参数的地方使用相同的名称。例如,如果 WidgetProcessor 类定义的方法中,有多个方法的第一个参数都是一个 Widget 对象,那么在每个方法中可以都把这个参数命名为 widget 甚或 w

  • 局部变量

局部变量的名称是实现细节,在类外部不可见。尽管如此,选择一个好名称仍会让代码更易于阅读、理解和维护。变量的命名方式往往与方法和字段的命名约定一样。

除了名称的种类有专门的约定之外,名称中可以使用的字符也有约定。Java 虽然允许在标识符中使用 $ 字符,但按照约定,$ 专门用于源代码处理程序生成的合成名称。例如,Java 编译器使用 $ 字符实现内部类。在你起的任何名称中都不应该使用 $ 字符。

Java 允许名称使用 Unicode 字符集中的任何字母数字字符。这对不说英语的程序员而言虽然便利,但始终没有流行开来,极少见到有人这么做。