添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
潇洒的保温杯  ·  “AEGP plugin Premiere ...·  3 月前    · 
坚韧的凉面  ·  喔喔·  6 月前    · 

1 前言

这份文档是 Google Java 编程风格规范的完整定义。当且仅当一个 Java 源文件符合此文档中的规则,我们才认为它符合 Google Java 编程风格。

与其它的编程风格指南一样,这里所讨论的不仅仅是编码格式美不美观的问题,同时也讨论一些约定及编码标准。然而,这份文档主要侧重于我们所普遍遵循的规则,对于那些不是明确强制要求的,我们尽量避免提供意见。

1.1 术语说明

本文档中除非特殊说明,否则:

  • 术语 class 可表示一个普通类、枚举类、接口或者注解。
  • 术语 comment 只用来指代实现的注释( implementation comments ),我们不使用文档注释( documentation comments )一词,而是用 Javadoc
  • 其他术语说明,将在文档中需要说明的地方单独说明。

    1.2 指南说明

    本文档中的示例代码并不作为规范。也就是说,虽然示例代码是遵循Google编程风格,但并不意味着这是展现这些代码的唯一方式。示例中的格式选择不应该被强制定为规则。

    2 源文件基础

    2.1 文件名

    源文件以其最顶层的类名(其中只有一个)来命名,大小写敏感,文件扩展名为 .java

    2.2 文件编码:UTF-8

    源文件编码格式使用 UTF-8

    2.3 特殊字符

    2.3.1 空格字符

    除了换行符外, ASCII 水平空白字符(0x20)是源码文件中唯一支持的空格字符。这意味着:

  • 所有其他空白字符将被转义。
  • Tab 字符不被用作缩进控制。
  • 2.3.2 特殊转义字符串

    任何需要转义字符串表示的字符(例如: \b , \t , \n , \f , \r , \' , \\ 等),采用这种转义字符串的方式表示,而不采用对应字符的八进制数(例如 \012 )或 Unicode 码(例如: \u000a )表示。

    2.3.3 非ASCII字符

    对于其余非 ASCII 字符,直接使用 Unicode 字符(例如 ),或者使用对应的 Unicode 码(例如: \u221e )转义,都是允许的。 唯一需要考虑的是,何种方式更能使代码容易阅读和理解

    注意 :在使用 Unicode 码转义,或者甚至是有时直接使用 Unicode 字符的时候,建议多添加一些注释说明,将对别人读懂代码很有帮助。

    注意 :永远不要由于害怕某些程序可能无法正确处理非 ASCII 字符而让你的代码可读性变差。当程序无法正确处理非 ASCII 字符时,它自然无法正确运行,你就会去 fix 这些问题的了。(言下之意就是大胆去用非 ASCII 字符,如果真的有需要的话)

    3 源文件结构

    源文件按照先后顺序,由以下几部分组成:

  • 许可证( License )或版权信息( copyright )(如果需要)
  • package 语句
  • import 语句
  • class 类声明(每个源码文件只能有唯一一个顶级 class )。
  • 注意 :以上每个部分之间应该只有 一个空行 作为间隔。

    3.1 许可证或版权信息

    如果一个文件包含许可证或版权信息,那么它应当被放在文件最前面。

    3.2 package语句

    package 语句不换行,单行长度限制(4.4节)不适用于package语句。(即package语句写在一行里)

    3.3 import语句

    3.3.1 import不使用通配符

    import 语句中不应该使用通配符,不管是否是静态导入。

    3.3.2 import不换行

    import 语句不换行,列限制(4.4节)并不适用于 import 语句。(每个 import 语句独立成行)

    3.3.3 顺序和间距

    import 语句可分为以下几组,按照顺序,每组由 一个空行 分隔:

  • 所有的静态导入(static import)归为一组
  • com.google 包的 import 归为一组
  • 使用的第三方包的导入,每个顶级按字典顺序归为一组。例如: android , com , junit , org , sun
  • java 包归为一组
  • javax 包归为一组
  • 注意 :同一组内的 import 语句之间不应用空行隔开,同一组中的 import 语句按字典序排列。

    3.4 类声明

    3.4.1 只声明唯一一个顶级class

    每个源文件中只能有一个顶级class。

    3.4.2 类成员顺序

    类成员的顺序对代码的易读性有很大影响,但是没有一个统一正确的标准。不同的类可能有不同的排序方式。

    最重要的一点, 每个类应该以某种逻辑去排序它的成员,维护者应该要能解释这种排序逻辑 。比如,新的方法不能总是习惯性地添加到类的结尾,因为这样就是按时间顺序而非某种逻辑来排序的。

    3.4.2.1 重载:永不分离

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

    术语说明 :块状结构( block-­like construct )指的是一个类,方法或构造函数的主体。需要注意的是,数组初始化中的初始值可被选择性地视为块状结构(4.8.3.1节)。

    4.1 大括号

    4.1.1 使用大括号(即使是可选的)

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

    4.1.2 非空语句块采用 K&R 风格

    对于非空语句块,大括号遵循 Kernighan Ritchie 风格 ( Egyptian brackets ):

  • 左大括号前不换行
  • 左大括号后换行
  • 右大括号前换行
  • 如果右大括号结束是一个 语句块 或者 方法体 构造函数体 或者 有命名的类体 ,则需要换行。当右括号后面接 else 或者 逗号 时,不应该换行。
  • return () -> {
        while (condition()) {
            method();
    return new MyClass() {
        @Override public void method() {
            if (condition()) {
                try {
                    something();
                } catch (ProblemException e) {
                    recover();
            } else if (otherCondition()) {
                somethingElse();
            } else {
                lastThing();
    

    一些例外的情况,将在4.8.1节讲枚举类型的时候讲到。

    4.1.3 空语句块:使代码更简洁

    一个空的语句块,可以在左大括号之后直接接右大括号,中间不需要空格或换行。但是当一个由几个语句块联合组成的语句块时,则需要换行。(例如:if/else 或者try/catch/finally).

    // 这是可接受的
    void doNothing() {}
    // 这同样是可接受的
    void doNothingElse() {
    
    // 这是不可接受的:多块语句中没有简洁的空语句块
    try {
        doSomething();
    } catch (Exception e) {}
    

    4.2块缩进:2个空格

    每当一个新的语句块产生,缩进就增加两个空格。当这个语句块结束时,缩进恢复到上一层级的缩进格数。缩进要求对整个语句块中的代码和注释都适用。(例子可参考之前4.1.2节中的例子)。

    注意:根据实际的编程经验,2个空格缩进的代码在当前大屏的计算机上会显得十分拥挤,反而使得代码臃肿不够美观。所以,我这里建议使用4个空格来缩进,会使得更加美观,而且能侧面督促开发人员减少代码的嵌套层数。

    4.3 一行一个语句

    每条语句结束都需要换行。

    4.4 列长度限制:100

    Java代码的列长度限制为100个字符。 除了如下所述,任何超过此限制的行都必须跳行。这在4.5节会有详细解释。

  • 不可能满足行长度限制的行(例如,Javadoc中的一个长URL,或是一个长的JSNI方法参考)
  • packageimport语句(见3.2节和3.3节)
  • 注释中那些可能被剪切并粘贴到shell中的命令行
  • 注意:当前的计算机屏幕都已经比很宽了,而且变量及方法命名都较长,100个字符的长度反而会出现很多不必要的跳行,已经不适应当今的情况了,根据实际编程经验,我这里建议使用120个字符的宽度更为合适。

    4.5 换行

    术语说明:一般情况下,一行长代码为了避免超出列限制(100个字符)而被分为多行,我们称之为断行(line­-wrapping)。

    我们并没有全面,确定性的准则来决定在每一种情况下如何断行。很多时候,对于同一段代码会有好几种有效的换断行方式。

    注意: 提取方法局部变量可以解决问题,而不不需要进行断行。

    4.5.1 在何处断行

    断行的主要原则是:选择在更高级的语法逻辑处断行。其他一些原则如下:

  • 当一个非赋值运算的语句断行时,在运算符号之前断行。(这与Google的C++规范和JavaScrip规范等其他规范不同)。
  • 如果要在非赋值运算符处断行,那么在该符号前断开(比如+操作符,它将位于下一行)。以下的类运算符也可作为参考:
  •