Java编码规范

在本文档中,除非另有说明:

术语class可表示一个普通类,枚举类,接口或是annotation类型(@interface)
术语comment只用来指代实现的注释(implementation comments),我们不使用“documentation comments”一词,而是用Javadoc。
其他的术语说明会偶尔在后面的文档出现。

文件名

源文件以其最顶层的类名来命名,大小写敏感,文件扩展名为.java。

文件编码:UTF-8

源文件编码格式为UTF-8。

特殊字符

空白字符

除了行结束符序列,ASCII水平空格字符(0x20,即空格)是源文件中唯一允许出现的空白字符,这意味着:

所有其它字符串中的空白字符都要进行转义。
制表符不用于缩进。

特殊转义序列

对于具有特殊转义序列的任何字符(\b, \t, \n, \f, \r, \“, \‘及),我们使用它的转义序列,而不是相应的八进制(比如\012)或Unicode(比如\u000a)转义。

非ASCII字符

对于剩余的非ASCII字符,是使用实际的Unicode字符(比如∞),还是使用等价的Unicode转义符(比如\u221e),取决于哪个能让代码更易于阅读和理解。

对所有标识符都通用的规则

标识符只能使用ASCII字母和数字,因此每个有效的标识符名称都能匹配正则表达式\w+。

在Google其它编程语言风格中使用的特殊前缀或后缀,如name_, mName, s_name和kName,在Java编程风格中都不再使用。

标识符类型的规则

包名

包名全部小写,连续的单词只是简单地连接起来,不使用下划线。

类名

类名都以UpperCamelCase风格编写。

类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语。现在还没有特定的规则或行之有效的约定来命名注解类型。

测试类的命名以它要测试的类的名称开始,以Test结束。例如,HashTest或HashIntegrationTest。

方法名

方法名都以lowerCamelCase风格编写。

方法名通常是动词或动词短语。

下划线可能出现在JUnit测试方法名称中用以分隔名称的逻辑组件。一个典型的模式是:test_,例如testPop_emptyStack。 并不存在唯一正确的方式来命名测试方法。

常量名

常量名命名模式为CONSTANT_CASE,全部字母大写,用下划线分隔单词。那,到底什么算是一个常量?

每个常量都是一个静态final字段,但不是所有静态final字段都是常量。在决定一个字段是否是一个常量时, 考虑它是否真的感觉像是一个常量。例如,如果任何一个该实例的观测状态是可变的,则它几乎肯定不会是一个常量。
只是永远不打算改变对象一般是不够的,它要真的一直不变才能将它示为常量。

非常量字段名

非常量字段名以lowerCamelCase风格编写。

这些名字通常是名词或名词短语。

参数名

参数名以lowerCamelCase风格编写。

参数应该避免用单个字符命名。

局部变量名

局部变量名以lowerCamelCase风格编写,比起其它类型的名称,局部变量名可以有更为宽松的缩写。

虽然缩写更宽松,但还是要避免用单字符进行命名,除了临时变量和循环变量。

即使局部变量是final和不可改变的,也不应该把它示为常量,自然也不能用常量的规则去命名它。

类型变量名

类型变量可用以下两种风格之一进行命名:

单个的大写字母,后面可以跟一个数字(如:E, T, X, T2)。
以类命名方式(5.2.2节),后面加个大写的T(如:RequestT, FooBarT)。