本建议来自google
http://google-styleguide.googlecode.com/svn/trunk/javaguide.html
国内可能无法访问这个链接,写这篇文章的时候是在美国上的这个网络,下面的文章基本上翻译得到。
一、介绍
1.1 术语说明
在下面文档中,除非特殊说明
1. class的意思包括,普通的类,接口,枚举以及注解
2. comment 通常指implementation 的注释,没有使用短语"documentation comments" ,而是使用"Javadoc."
1.2 参考说明
文档中的实例代码是不规范的,因为如果全部是符合规范风格的代码没法举例做比较。
二、代码源文件基本风格
2.1 文件名
文件名包含了一个区分大小写的名字加上.java 的后缀
2.2 文件编码
文件编码为UTF-8
2.3 特殊字符
2.3.1 空白符
除了换行符,所有的空白的地方应该都是空格符ASCII 为(0x20),包括如下内容
1.所有其他的空白字符和是空白的字面的字都应该避免
2. Tab键产生的空格需要避免(Eclipse 有这方面的设置)
2.3.2 特殊的转义字符
对于任何有特殊的转义字符的,使用这些(\b, \t , \n , \f , \r , \", \' 和 \\),比使用效果相同的八进制(例如 \012)和Unicode(\u000a)要好。
2.3.3 Non-ASCII 码
对于一些不常用的非ASCII码,比如无穷,能避免的避免,不能的应该加上相应的注释
举个例子:
String unitAbbrev = "μs"; String unitAbbrev = "\u03bcs"; // "μs" String unitAbbrev = "\u03bcs"; // Greek letter mu, "s" String unitAbbrev = "\u03bcs";
说明:
第一种最好,清楚明白,不要注释
第二种也可以,但是没有理由这么做,因为注释上能写出来,直接写出来不就行了
第三种也可以,但是比较奇怪而且容易出错
三、源代码结构风格
3.1 License 或者Copyright
如果license 或者copyright 信息属于某个文件,它应该出现在文件中
3.2 Package 的声明
包的声明不应该是大于一行的,字符数控制在一行(大概80-100,后面会说一行的字符数)
3.3 Import 的声明
3.3.1 不应该有通配符
这就说明了,如果没有特殊情况,别用xxx.*导入一个包下的所有文件的情况
3.3.2 不应该有换行符
3.3.3 排序和空白
导入的东西应该分组,不同的组用一个空白行来分开,这些组的顺序是这样的
1. 所有你自己的类在一个单独的组
2. com.google在一个组中(广告,哈哈)
3. 第三方的包,也需要按产品来分,比如android,com,junt,org,sun
4. java 的导入
5. javax的导入
3.4 类的声明
3.4.1 精确的命名最高级别的类名(类中可能有内部类)
3.4.2 类的成员排序
类成员的排序应该对学习和理解有帮助,这个没有一个秘方告诉你怎么做,不同的类成员的顺序也是不一样的。
其中一个重要的方法是按照某些逻辑规则来排序。
3.4.2.1 重载的方法永远不应该分开
四、格式化
4.1 括号
4.1.1 但有选择的情况下应该用括号
比如说存在if, else , for , do 和 while的使用,甚至内容为空。
4.1.2 非空代码块
括号参照K&R样式:
1. 括号开始(前括号)之前不要有空白行
2. 括号开始(前括号)之后要有空白行
3. 括号结束(后括号)之前应该有空白行
4. 括号结束(后括号)之后有空白行,但是如果后面接else ,catch,或者是类,结构体的的后括号,后者后面需要带分号.
下面是举例
return new MyClass() { @Override public void method() { if (condition()) { try { something(); } catch (ProblemException e) { recover(); } } } };
4.1.3 空的块
类似空的块这样的括号应该紧跟在一起,除非是后面有多层的情况(if/else if/else 或者try/catch/finaly)
void doNothing() {}
4.2 块缩排
不同级别的块的缩小排放是2个空白符,即2个英文字符的宽度,左右方向键应该是4个空。
4.3 一个类型的代码清单要空一行
4.4 行长度为80或者100
例外,有些情况下有例外
1.比如长的URL,JSNI的方法
2. package 或者import ,我们可以控制自己,但是控制不了别人
3. 命令行中命令,和说明,你准备把这些东西放拷贝到一个shell中的,不要因为这些规则让你很不方便。
4.5 行的折叠(Line-warpping)
通常情况下行长度为80-100,但是不要因为这个规则而让一个单词变成多个。还有有些情况下需要折叠。
4.5.1 在什么地方打断当前行
主要方向是在高语法级别处选择换行
1.比如说在多个catch的时候,多个.(点)的时候,或者继承
2. 多个定义的逗号
4.5.2 独立的连续的行被打断后,至少前面放4个空格符
4.6 空白区域
4.6.3 水平对齐:没有要求
private int x; // this is fine private Color color; // this too private int x; // permitted, but future edits private Color color; // may leave it unaligned
在本文中,没有必要把所有的注释水平对齐
4.7 Grouping parentheses
4.8 特殊结构
4.8.1 枚举类型
private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }
4.8.2 变量声明
4.8.2.1 一次声明一个变量
4.8.2.2 声明之后尽快初始化
4.8.3 数组
数组的初始化,和一个块的格式是一样的,所以下面的格式都是可以的
new int[] { new int[] { 0, 1, 2, 3 0, } 1, 2, new int[] { 3, 0, 1, } 2, 3 } new int[] {0, 1, 2, 3}
4.8.4 Switch
switch (input) { case 1: case 2: prepareOneOrTwo(); // fall through case 3: handleOneTwoOrThree(); break; default: handleLargeNumber(input); }
4.8.5 注解
@Override @Nullable public String getNameIfPresent() { ... }
@Override public int hashCode() { ... }
@Partial @Mock DataLoader loader;
4.8.6 注释
/* * This is // And so /* Or you can * okay. // is this. * even do this. */ */
4.8.7 修改
类和成员的修改,按照下面的推荐的顺序修改。
public protected private abstract static final transient volatile synchronized native strictfp
4.8.8 数字
Long 型的数字后缀加L比小l好
5 命名
5.1 对于所有标识符的一般规则
标识符只使用ASCII码和数字,除了下面有两种特殊情况下还会用到下划线,像下面的标识符 name_, mName, s_name, kName都不再使用。
5.2 标识符类型推荐规则
5.2.1 包名
报名全部小写,也不用下划线
例如
com.example.deepspace //推荐使用 com.example.deepSpace //不推荐使用 com.example.deep_space //不推荐使用