3. 布局规范
3.1. 缩进对齐
? 规则
1) 缩进使用4个空格,不允许使用Tab。 2) 对齐使用空格,不允许使用Tab。
3.2. 一行一个语句
? 规则
1) 一行代码只做一件事情,如只定义一个变量,或只写一条语句(for语句除外)。 2) if、for、while、do、switch等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。
示例a为风格良好的代码行,示例b为风格不良的代码行。
int width; int depth; x=a + b; y = c + d; z = e + f; if (width < height){ dosomething(); } for (initialization; condition; update){ dosomething(); } // 空行 other(); a风格良好的代码行 b风格不良的代码行 for (initialization; condition; update) dosomething(); other(); if (width < height) dosomething(); // 宽度 // 深度 x = a + b; y = c + d; z = e + f; int height; // 高度 int width, height, depth;// 宽度高度深度
6
3.3. 行长度
? 规则
一行80个字符的限制(package、import除外),超过必须换行。 ? 建议
1) 当一个表达式无法容纳在一行内时,可以依据如下规则断开: - 在一个逗号后面断开 - 在一个操作符前面断开
- 新的一行应该与上一行同一级别表达式的开头处对齐
- 如果以上规则导致你的代码混乱或者使你的代码都堆挤在右边,那就代之以缩进4个空格。 示例:
if ((veryLongerVariable1 >= veryLongerVariable12) && (veryLongerVariable3 <= veryLongerVariable14) && (veryLongerVariable5 <= veryLongerVariable16)){ dosomething(); } 3.4. 行数
? 建议
1) 每个Java源文件不超过2000行,太长的程序难以阅读,应该尽量避免。 2) 每个方法建议不要超过120行,最多不超过300行。
3.5. 空行
? 规则
1) 类内连续的成员之间:字段、构造函数、方法、嵌套类、静态初始化块、实例初始化块间需要一个空行。
2) 在每个类/接口声明之后、每个函数定义结束之后都要加空行。参见示例a。
7
3) 在一个函数体内,局部变量定义和方法的第一条语句之间应加空行分隔。参见示例b。
4) 在一个函数体内,在两个逻辑段之间应加空行分隔。参见示例b。 5) 在块注释或单行注释之前,都要加空行。参见示例a。
// 空行 /*
*Here is a block comment. */
void Function1(…){ … } // 空行
void Function2(…){ … } // 空行
void Function3(…){ … }
// 空行
while (condition){ int var1; int var2; // 空行 statement1; // 空行
if (condition) { } // 空行 statement4; }
statement2; statement3;
}else{
示例a函数之间的空行 示例b函数内部的空行
? 建议
允许使用多个空行,但是如果无法提升代码可读性的话就不建议使用。
3.6. 空格
? 规则
1) 关键字之后要留空格。如abstract、static、final、case 等关键字之后至少要留一个空格,否则无法辨析关键字。如if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。 2) ‘)’与之后的‘{’之间保留一个空格。
3) 函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。 4) ‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。 5) ‘,’之后要留空格,如function(x, y, z)。
8
6) 如果‘;’不是一行的结束符号,其后要留空格,如for (initialization; condition; update)。
7) 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”、“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”、“^”等二元操作符的前后应当加空格。
8) 一元操作符如“!”、“~”、“++”、“--”等前后不加空格。 9) 像“[]”、“.”这类操作符前后不加空格。
示例:
void func1(int x, int y, int z); // 良好的风格 if (year >= END_YEAR) // 良好的风格 if ((a>=b) && (c<=d)) // 良好的风格 for (i =0; i
id func1 (int x,int y,int z);// 不良的风格 if(year>=END_YEAR) // 不良的风格 if(a>=b&&c<=d) // 不良的风格 for(i=0;i<10;i++) // 不良的风格 for (i = 0; I < 10; i ++) //过多的空格 x=a
? 规则
1) 大括号与if、 else、 for、do、while语句一起使用时,即使只有一条语句(或是空),也应该把大括号写上。 2) 非空块:K & R 风格
对于非空块和块状结构,大括号遵循Kernighan和Ritchie风格: - 左大括号前不换行 - 左大括号后换行 - 右大括号前换行
9
- 如果右大括号是一个语句、函数体或类的终止,则右大括号后换行; 否则不换行。例如,如果右大括号后面是else或逗号,则不换行。 示例:
return new MyClass() { @Override public void method() { if (condition()) { try { something(); } catch (ProblemException e) { recover(); } } } };
3) 空块:可以用简洁版本
一个空的块状结构里什么也不包含,大括号可以简洁地写成{},不需要换行。例外:如果它是一个多块语句的一部分(if/else 或 try/catch/finally) ,即使大括号内没内容,右大括号也要换行。 示例:
void doNothing() {} try { something(); } catch (ProblemException e) { } finally{ }
3.8. 圆括号
? 建议
在含有多种运算符的表达式中要使用圆括号来避免运算符优先级问题。 示例:
if (a == b && c == d) // 不推荐 if ((a == b) && (c == d)) // 推荐
10