import语句
- 尽量不要使用通配符,如
import java.util.*
- 按照是否静态、顶级包等性质对import进行分组。
声明
类声明
- 每个顶级类都在一个与它同名的源文件中。
- 累成员顺序需要按照一定的逻辑关系组织在一起,而不是新的方法习惯性添加到类的结尾。
- 当有多个同名重载函数时,这些函数应该按照一定的逻辑顺序连续放在一起。
变量声明
- 每次只声明一个变量,不要使用组合声明。
- 需要使用变量时才声明(在第一次使用时才声明),并尽快初始化。不要在一个代码快把局部变量都一次性声明。
- 数组初始化:写成块状结构。
1 | new int[] {0, 1, 2, 3}; |
命名约定
约定
- 包名全部小写,连续的单词只是简单连接起来,不使用下划线。
- 类名以
UpperCamelCase
风格命名,通常是名词或者名词短语,接口名称有时可能是形容词或者形容词短语。 - 测试类的命名以要测试的类的名称开始,以
Test
结束。 - 方法名以
lowerCamelCase
风格命名。方法名通常是动词或者动词短语。下划线可能出现在JUnit测试方法名称中以分割名称的逻辑组件,一个典型的模式是:test<MethodUnderTest>_<state>
。 - 常量命名模式为
CONSTANT_CASE
,全部字母大写,用下划线分割单词。 - 非常量字段名,按照
lowerCamelCase
。 - 参数名,按照
lowerCamelCase
。 - 局部变量名,按照
lowerCamelCase
,但是可以有更为宽松的缩写。
CamelCase
驼峰式命名法分大驼峰式命名法(UpperCamelCase)和小驼峰式命名法(lowerCamelCase)。 名字从散文形式(prose form)开始:
- 把短语转换为纯ASCII码,并且移除任何单引号。例如:”Müller’s algorithm”将变成”Muellers algorithm”。
- 把这个结果切分成单词,在空格或其它标点符号(通常是连字符)处分割开。
推荐:如果某个单词已经有了常用的驼峰表示形式,按它的组成将它分割开(如”AdWords”将分割成”ad words”)。 需要注意的是”iOS”并不是一个真正的驼峰表示形式,因此该推荐对它并不适用。 - 现在将所有字母都小写(包括缩写),然后将单词的第一个字母大写:
- 每个单词的第一个字母都大写,来得到大驼峰式命名。
- 除了第一个单词,每个单词的第一个字母都大写,来得到小驼峰式命名。
- 最后将所有的单词连接起来得到一个标识符。
示例:
1 | Prose form Correct Incorrect |
格式
大括号
- 与
if, else, for, do, while
一起使用,即使只有一条语句,也需要加上大括号。 - 非空块时遵循Kernighan风格:
- 左大括号前不换行
- 左大括号后换行
- 右大括号前换行
- 如果右大括号是一个语句、函数体或类的终止,则右大括号后换行; 否则不换行。例如,如果右大括号后面是else或逗号,则不换行。
1 | return new MyClass() { |
- 空块,可以直接使用单行
void doNothing() {}
空白
垂直空白
- 类内连续成员之间(可选,主要是用于逻辑分组)
- 函数体内,语句的逻辑分组之间。
水平空白
- 任何保留字与紧随其后的左括号
(
时: - 任何保留字与其前面的右大括号
}
- 任何左大括号前
{
- 任何二元或三元运算符的两侧
, : ;
及右括号)
后- 括号内的最左最右元素的空格不是必须的。
1 |
|
用小括号来指定逻辑组:推荐
自动换行
- 如果在
非赋值运算符
处断开,则应该在该符号之前断开(比如+
,应该和后面的语句一起放到下一行) - 如果在
赋值运算符
出断开,通常在该符合之后断开。 - 方法名或够照函数名与左括号留在同一行。
- 逗号(
,
)与前面的内容留在同一行。
注释
块注释风格
块注释与其周围的代码在同一缩进级别。它们可以是/* ... */
风格,也可以是// ...
风格。对于多行的/* ... */
注释,后续行必须从*
开始, 并且与前一行的*
对齐。以下示例注释都是OK的。
1 | /* |
JavaDoc
参考如何写Java文档注释(Java Doc Comments)
“文档注释”(Java Doc Comments)是专门为了用javadoc工具自动生成文档而写的注释,它是一种带有特殊功能的注释。
文档注释只负责描述类(class)、接口(interface)、方法(method)、构造器(constructor)、成员字段(field)。相应地,文档注释必须写在类、接口、方法、构造器、成员字段前面,而写在其他位置,比如函数内部,是无效的文档注释。
文档注释采用HTML语法规则书写,支持HTML标记(tag),同时也有一些额外的辅助标记。需要注意的是,这些标记不是给人看的(通常他们的可读性也不好),他们的作用是为了javadoc工具更好地生成最终文档。
文档注释与一般注释的最大区别在于起始符号是`/而不是
/或
//`。*
Javadoc块的基本格式如下所示:
1 | 一个文档注释由两部分组成: |
描述部分自然不用多说,所谓的标记符号指的是@param, @return, @see之类的。
或者是以下单行形式:
1 | /** An especially short bit of Javadoc. */ |
需要注意的几点:
- 第一行以特殊的文档定界符
/**
开头 - 在描述段落和标记段落之间空一行,描述段落和标记段落必须分开,不能揉在一起,描述段落必须在标记段落之前
- 每一行注释都应该跟后面描述的类、方法等保持同样距离的缩进
描述部分(Description)
描述部分的第一行应该是一句对类、接口、方法等的简单描述,这句话最后会被javadoc工具提取并放在索引目录中。
怎么界定第一句话到哪结束了呢?答案是跟在第一个句号(英文标点)之后的tab、空行或行终结符规定了第一句的结尾。
例如下面这句注释,第一句的结尾是Prof.:
1 | /** |
除了普通的文本之外,描述部分可以使用:
- HTML语法标签,例如
<b>xxx</b>
- javadoc规定的特殊标签,例如
{@link xxx}
。标签的语法规则是:{@标签名 标签内容}
需要注意的地方:
- 标签在有javadoc工具生成文档时会转化成特殊的内容,比如
{@link URL}
标签会被转化成指向URL类的超链接 - 如果注释包含多段内容,段与段之间需要用
<p>
分隔,空行是没用的 - 最后结尾行
*/
和起始行不同,这里只有一个星号 - 为了避免一行过长影响阅读效果,务必将每行的长度限制在80个字符以内
- 善用javadoc工具的复制机制避免不必要的注释:
如果一个方法覆盖了父类的方法或实现了接口种的方法,那么javadoc工具会在该注释里添加指向原始方法的链接,此外如果新方法没有注释,那么javadoc会把原始方法的注释复制一份作为其注释,但是如果新方法有注释了,就不会复制了。
注释风格:
- 使用
<code>关键字</code>
来强调关键字,建议强调的内容有:java关键字、包名、类名、方法名、接口名、字段名、参数名等 - 控制
{@link xxx}
的数量,太多的链接会使文档的可读性很差,因为读者总是跳来跳去。不要出现相同的链接,同样的链接只保留第一个;不要为java自带的内容或是常识性的内容提供链接 - 描述一个方法时,应当只保留方法名字,不要附带方法的参数。比如有个方法是add(Object obj),那么用add指代该方法即可,而不是add(Object obj)
- 英文注释可以是短语也可以是句子。如果是句子,首字母要大写,如果是短语,首字母小写。
- 英文注释使用第三人称,而不是第二人称。
标记部分(Tag)
1 | @author(只出现在类和接口的文档中) |
此外,如果有多个相同标记,也要注意顺序:
1 | 多个@author标记,应该按照时间顺序排列,即原作者应该排在第一个位置 |
如果方法有参数,@param标记必须包含,而且每个对应一个参数
如果方法有返回值,@return标记必须包含
空行(即,只包含最左侧星号的行)会出现在段落之间和Javadoc标记(@XXX)之前(如果有的话)。 除了第一个段落,每个段落第一个单词前都有标签<p>
,并且它和第一个单词间没有空格。
至少在每个public类及它的每个public和protected成员处使用Javadoc,除了测试类和方法。
Examples:
1 | /** |
1 | /** |
编程实践
- switch, default不能省略。
- 静态成员:使用类进行调用
- @Override:能用则用
- Finalizers: 禁用