【代码规范】Google代码规范

文件名

源文件以其最顶层的类名来命名,大小写敏感。例如:包名为com.bcw.ewms,文件名设置为ewms

统一文件编码UTF-8

特殊字符

- **空白字符**:除了行结束符序列,ASCII水平空格字符(0x20,即空格)是源文件中唯一允许出现的空白字符
- **特殊转义序列**:对于具有特殊转义序列的任何字符(\b, \t, \n, \f, \r, ", '及\),我们使用它的转义序列,而不是相应的八进制(比如\012)或Unicode(比如\u000a)转义。
- **非ASCII字符**:对于剩余的非ASCII字符,是使用实际的Unicode字符(比如∞),还是使用等价的Unicode转义符(比如\u221e),取决于哪个能让代码更易于阅读和理解。

Tip: 在使用Unicode转义符或是一些实际的Unicode字符时,建议做些注释给出解释

`
      String unitAbbrev = "μs";                                 | 赞,即使没有注释也非常清晰
      String unitAbbrev = "\u03bcs"; // "μs"                    | 允许,但没有理由要这样做
      String unitAbbrev = "\u03bcs"; // Greek letter mu, "s"    | 允许,但这样做显得笨拙还容易出错
          String unitAbbrev = "\u03bcs";                            | 很糟,读者根本看不出这是什么
          return '\ufeff' + content; // byte order mark             | Good,对于非打印字符,使用转义,并在必要时写上注释
`

源文件结构

  1. 许可证或版权信息(如有需要)
  2. package语句
  3. import语句

    import不要使用通配符。例如:import java.util.*;

  4. 一个顶级类(只有一个)

类声明

  1. 只有一个顶级类声明

    每个顶级类都在一个与它同名的源文件中

  2. 类成员顺序

    每个类应该以某种逻辑去排序它的成员,维护者应该要能解释这种排序逻辑。

  3. 重载:永不分离

    当一个类有多个构造函数,或是多个同名方法,这些函数/方法应该按顺序出现在一起,中间不要放进其它函数/方法。

格式

  1. 大括号

    大括号与if, else, for, do, while语句一起使用,即使只有一条语句(或是空),也应该把大括号写上。

  2. 非空块:K & R 风格

    • 左大括号前不换行
    • 左大括号后换行
    • 右大括号前换行
    • 如果右大括号是一个语句、函数体或类的终止,则右大括号后换行; 否则不换行。例如,如果右大括号后面是else或逗号,则不换行。
  3. 空块

    void doNothing() {}
    
  4. 每个语句后要换行。

  5. 列限制:80或100字符

  6. 断开

    1. 如果在非赋值运算符处断开,那么在该符号前断开(比如+,它将位于下一行)。注意:这一点与Google其它语言的编程风格不同(如C++和JavaScript)。 这条规则也适用于以下“类运算符”符号:点分隔符(.),类型界限中的&(),catch块中的管道符号(catch (FooException | BarException e)
    2. 如果在赋值运算符处断开,通常的做法是在该符号后断开(比如=,它与前面的内容留在同一行)。这条规则也适用于foreach语句中的分号。
    3. 方法名或构造函数名与左括号留在同一行。
    4. 逗号(,)与其前面的内容留在同一行。】
  7. 自动换行时缩进至少+4个空格

空白

  1. 水平空白
  2. 垂直空白
  3. 水平对齐

用小括号来限定组

具体结构

  1. 枚举

    枚举常量间用逗号隔开,换行可选。

  2. 每次只声明一个变量

  3. 需要时才声明,并尽快进行初始化

  4. 数组

    1. 数组初始化:可写成块状结构
    2. 非C风格的数组声明:中括号是类型的一部分:String[] args, 而非String args[]。
  5. switch语句
    1.switch块中的内容缩进为2个空格。
    2.在一个switch块内,每个语句组要么通过break, continue, return或抛出异常来终止,要么通过一条注释来说明程序将继续执行到下一个语句组, 任何能表达这个意思的注释都是OK的(典型的是用// fall through)。这个特殊的注释并不需要在最后一个语句组(一般是default)中出现

  6. 注解(Annotations)

    注解紧跟在文档块后面,应用于类、方法和构造函数,一个注解独占一行。

注释

  1. 块注释风格

    块注释与其周围的代码在同一缩进级别。它们可以是//风格,也可以是// …风格。对于多行的//注释,后续行必须从开始, 并且与前一行的对齐

命名约定

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

    标识符只能使用ASCII字母和数字,因此每个有效的标识符名称都能匹配正则表达式\w+。在Google其它编程语言风格中使用的特殊前缀或后缀,如name_, mName, s_name和kName,在Java编程风格中都不再使用。

  2. 标识符类型的规则

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

      类名都以UpperCamelCase风格编写。

    2. 方法名

      方法名都以lowerCamelCase风格编写。

    3. 常量名

      常量名命名模式为CONSTANT_CASE,全部字母大写,用下划线分隔单词。

    4. 非常量字段名

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

    5. 参数名

      参数名以lowerCamelCase风格编写。

    6. 局部变量名

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

      1. 类型变量名
        类型变量可用以下两种风格之一进行命名:
        单个的大写字母,后面可以跟一个数字(如:E, T, X, T2)。
        以类命名方式(5.2.2节),后面加个大写的T(如:RequestT, FooBarT)。

参考文档

http://www.hawstein.com/posts/google-java-style.html