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