Google 官方Java 编码规范( 二 )


格式术语说明:块状结构(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 new MyClass() {@Override public void method() {if (condition()) {try {something();} catch (ProblemException e) {recover();}}}};4.8.1节给出了enum类的一些例外 。
4.1.3 空块:可以用简洁版本一个空的块状结构里什么也不包含,大括号可以简洁地写成{},不需要换行 。例外:如果它是一个多块语句的一部分(if/else 或 try/catch/finally) ,即使大括号内没内容,右大括号也要换行 。
示例:
void doNothing() {}4.2 块缩进:2个空格每当开始一个新的块,缩进增加2个空格,当块结束时,缩进返回先前的缩进级别 。缩进级别适用于代码和注释 。(见4.1.2节中的代码示例)
4.3 一行一个语句每个语句后要换行 。
4.4 列限制:80或100一个项目可以选择一行80个字符或100个字符的列限制,除了下述例外,任何一行如果超过这个字符数限制,必须自动换行 。
例外:
  • 不可能满足列限制的行(例如,Javadoc中的一个长URL,或是一个长的JSNI方法参考) 。
  • package和import语句(见3.2节和3.3节) 。
  • 注释中那些可能被剪切并粘贴到shell中的命令行 。
4.5 自动换行术语说明:一般情况下,一行长代码为了避免超出列限制(80或100个字符)而被分为多行,我们称之为自动换行(line-wrApping) 。
我们并没有全面,确定性的准则来决定在每一种情况下如何自动换行 。很多时候,对于同一段代码会有好几种有效的自动换行方式 。
Tip:
提取方法或局部变量可以在不换行的情况下解决代码过长的问题(是合理缩短命名长度吧)
4.5.1 从哪里断开自动换行的基本准则是:更倾向于在更高的语法级别处断开 。
  1. 如果在非赋值运算符处断开,那么在该符号前断开(比如+,它将位于下一行) 。注意:这一点与Google其它语言的编程风格不同(如C++和JavaScript) 。这条规则也适用于以下“类运算符”符号:点分隔符(.),类型界限中的&(<T extends Foo & Bar>),catch块中的管道符号(catch (FooException | BarException e)
  2. 如果在赋值运算符处断开,通常的做法是在该符号后断开(比如=,它与前面的内容留在同一行) 。这条规则也适用于foreach语句中的分号 。
  3. 方法名或构造函数名与左括号留在同一行 。
  4. 逗号(,)与其前面的内容留在同一行 。
4.5.2 自动换行时缩进至少+4个空格自动换行时,第一行后的每一行至少比第一行多缩进4个空格(注意:制表符不用于缩进 。见2.3.1节) 。
当存在连续自动换行时,缩进可能会多缩进不只4个空格(语法元素存在多级时) 。一般而言,两个连续行使用相同的缩进当且仅当它们开始于同级语法元素 。
第4.6.3水平对齐一节中指出,不鼓励使用可变数目的空格来对齐前面行的符号 。
4.6 空白4.6.1 垂直空白以下情况需要使用一个空行:
  1. 类内连续的成员之间:字段,构造函数,方法,嵌套类,静态初始化块,实例初始化块 。
    > 例外: 两个连续字段之间的空行是可选的,用于字段的空行主要用来对字段进行逻辑分组 。
  2. 在函数体内,语句的逻辑分组间使用空行 。
  3. 类内的第一个成员前或最后一个成员后的空行是可选的(既不鼓励也不反对这样做,视个人喜好而定) 。
  4. 要满足本文档中其他节的空行要求(比如3.3节:import语句)
  5. 多个连续的空行是允许的,但没有必要这样做(我们也不鼓励这样做) 。
4.6.2 水平空白除了语言需求和其它规则,并且除了文字,注释和Javadoc用到单个空格,单个ASCII空格也出现在以下几个地方:
  1. 分隔任何保留字与紧随其后的左括号(()(如if, for catch等) 。
  2. 分隔任何保留字与其前面的右大括号(})(如else, catch) 。


    推荐阅读