Google Java编程风格指南
源文件
- 源文件以其最顶层的类名来命名,大小写敏感,文件扩展名为.java
- 编码格式为UTF-8
字符
- 仅允许出现行结束符序列和空格
- 具有特殊转义序列的任何字符(\b, \t, \n, \f, \r, ", ',\),使用其转义序列
- 使用Unicode转义符时,必须注释
源文件结构
- 许可证或版权信息(如有需要)
- package语句
package语句写在一行里
- import语句
import语句不换行
不要使用通配符
分组,每组由一个空行分隔,按字典序排列
- 静态导入
- com.goole
- 第三方 android,com,junit,org,sun
- java
- javax
- 一个顶级类(只有一个)
类
- 只有一个顶级类声明
- 类的成员按逻辑排序
- 重载,永不分离
格式
大括号
- 必选:大括号与if, else, for, do, while语句一起使用,即使只有一条语句(或是空),也应该把大括号写上。
- 大括号遵循Kernighan和Ritchie风格
- 左大括号前不换行
- 左大括号后换行
- 右大括号前换行
- 如果右大括号是一个语句、函数体或类的终止,则右大括号后换行; 否则不换行
- 空块,大括号可以简洁地写成{},不需要换行
缩进
- 每当开始一个新的块,缩进增加2个空格
- 当块结束时,缩进返回先前的缩进级别
- 每个语句后要换行
- 列限制:80或100
自动换行:更倾向于在更高的语法级别处断开
- 自动换行时缩进至少+4个空格
- 在非赋值运算符处断开,那么在该符号前断开(比如+,它将位于下一行)
- 如果在赋值运算符处断开,通常的做法是在该符号后断开(比如=,foreach :,它与前面的内容留在同一行)
- 方法名或构造函数名与左括号留在同一行
- 逗号(,)与其前面的内容留在同一行
水平空白
- 如果在一条语句后做注释,则双斜杠(//)两边都要空格
用小括号来限定组
- 尽可能使用()表示Java运算符优先级
变量声明
- 每次只声明一个变量
- 需要时才声明,并尽快进行初始化
数组
- 数组初始化:可写成块状结构
- 中括号是类型的一部分:String[] args
switch语句
- 块中的内容缩进为2个空格
- 每个switch标签后新起一行,再缩进2个空格,写下一条或多条语句
- Fall-through:注释
通过一条注释来说明程序将继续执行到下一个语句组
- 每个switch语句都包含一个default语句组,即使它什么代码也不包含
modifiers顺序
- public protected private abstract static final transient volatile synchronized native strictfp
注释
块注释
- 块注释与其周围的代码在同一缩进级别
- 对于多行的/* ... */注释,后续行必须从*开始,并且与前一行的*对齐
命名
- 标识符只能使用ASCII字母和数字
- 不使用特殊前缀或后缀
- 包名全部小写,连续的单词只是简单地连接起来,不使用下划线
- 类名都以UpperCamelCase风格编写
- 测试类的命名以它要测试的类的名称开始,以Test结束
- 类型变量名
单个的大写字母,后面可以跟一个数字(如:E, T, X, T2)
以类命名方式,后面加个大写的T
- 方法名都以lowerCamelCase风格编写
- 参数名以lowerCamelCase风格编写
参数应该避免用单个字符命名
- 常量名命名模式为CONSTANT_CASE,全部字母大写,用下划线分隔单词
- 非常量字段名以lowerCamelCase风格编写
- 局部变量名以lowerCamelCase风格编写
即使局部变量是final和不可改变的,也不应该把它示为常量
编程实践
- @Override:能用则用
- 捕获的异常:不能忽视
典型的响应方式是打印日志
如果它被认为是不可能的,则把它当作一个AssertionError重新抛出
如果它确实是不需要在catch块中做任何响应,需要做注释加以说明
在测试中,如果一个捕获的异常被命名为expected,则它可以被不加注释地忽略
- 静态成员:使用类进行调用
- Finalizers: 禁用
Javadoc
waylau/java-code-conventions
Java 源文件示例
/*
* @(#)Blah.java 1.82 99/03/18
*
* Copyright (c) 1994-1999 Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary information of Sun
* Microsystems, Inc. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Sun.
*/
package java.blah;
import java.blah.blahdy.BlahBlah;
/**
* Class description goes here.
*
* @version 1.82 18 Mar 1999
* @author Firstname Lastname
*/
public class Blah extends SomeClass {
/* A class implementation comment can go here. */
/** classVar1 documentation comment */
public static int classVar1;
/**
* classVar2 documentation comment that happens to be
* more than one line long
*/
private static Object classVar2;
/** instanceVar1 documentation comment */
public Object instanceVar1;
/** instanceVar2 documentation comment */
protected int instanceVar2;
/** instanceVar3 documentation comment */
private Object[] instanceVar3;
/**
* ...constructor Blah documentation comment...
*/
public Blah() {
// ...implementation goes here...
}
/**
* ...method doSomething documentation comment...
*/
public void doSomething() {
// ...implementation goes here...
}
/**
* ...method doSomethingElse documentation comment...
* @param someParam description
*/
public void doSomethingElse(Object someParam) {
// ...implementation goes here...
}
}