Java开发规范之代码格式篇(上)

在程序员的世界里有两件最讨厌的事情,第一件事情是讨厌写代码注释,第二件事情是讨厌看别人的代码不写注释。虽然这只是个段子,但也反映了当下很多程序员的心声。下面简单介绍下代码规范的重要性,第一,规范的代码可以促进团队合作,第二,规范的代码可以减少bug处理,第三,规范的代码可以降低维护成本,第四,规范的代码有助于代码审查,第五,养成代码规范的习惯,有助于程序员自身的成长。

本系列文章将整合 阿里巴巴《Java开发手册》 和  谷歌《Java编程规范》 ,总结Java开发过程的编码规范,并通过具体编码案例给出编码规范的原因,如果总结内容存在问题还望指出。


目录

1.大括号换行

2.括号空格

3.禁止tab字符

4.注释内容与双斜线需一个空格

5.强制转换时右括号与值不需要空格


本篇将继续介绍Java开发规范过程的代码格式问题,代码格式一般是指代码的表现形式,如空格,对齐样式,长度控制等,由于篇幅内容较多将分为上下两篇,下篇文章链接 Java开发规范之代码格式篇(下)

1.大括号换行

Alibaba规约(强制

如果是大括号内为空,则简洁地写成{}即可,大括号中间无需换行和空格;

如果是非空代码块则遵循下列规则:

  • 左大括号前不换行。
  • 左大括号后换行。
  • 右大括号前换行。
  • 右大括号后还有else等代码则不换行;表示终止的右大括号后必须换行。

Google规约

对于非空块和块状结构,大括号遵循Kernighan和Ritchie风格 (Egyptian brackets):

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

一个空的块状结构里什么也不包含,大括号可以简洁地写成 {} ,不需要换行。例外:如果它是一个多块语句的一部分(if/else 或 try/catch/finally) ,即使大括号内没内容,右大括号也要换行。

说明:大括号一般是函数、代码块和方法块等整块代码作为功能逻辑的标志符号,因此整洁的代码格式可以清楚了解代码逻辑层次。

区别:两个大厂的规约基本相同,Google规约说明更加详细,Alibaba规约只列举一个示例但也应该默认业界常用规范。

正例:

void doNothing() {}  // 正例,代码为空,大括号简写

void doSomething(int flag) {
    // 正例,左大括号后换行
    if (flag == 1) {
        System.out.println("world");
    // 正例,右大括号前换行
    } else { //正例,右大括号后有else,不用换行
        System.out.println("ok");
    // 正例,在右大括号后直接结束,则必须换行
    }
}

try {
    int result = 1 / 0;
    System.out.println(result);
} catch (Exception e) { // 正例,右大括号后有catch, 代码未结束,不用换行
    // 正例,作为try/catch/finally部分 ,即使大括号内没内容,右大括号也要换行
} finally {
    // 正例,finally部分 ,即使大括号内没内容,右大括号也要换行,一般实际不这样写空代码只作为参考
}

反例:

// 反例,左括号不用换行,右括号如果内容为空也不用换行
void doNothing() 
{
}  

// 反例,左括号不用换行,右括号如果代码未结束也不用换行
void doSomething(int flag) 
{
    if (flag == 1) 
    {
        System.out.println("world");
    } 
    else
    { 
        System.out.println("ok");
    }
}

2.括号空格

Alibaba规约(强制

  • 左小括号和字符之间不出现空格,同样,右小括号和字符之间也不出现空格;而左大括号前需要空格。
  • if/for/while/switch/do等保留字与括号之间都必须加空格。
  • 任何二目、三目运算符的左右两边都需要加一个空格。运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号等。

Google规约

除了语言需求和其它规则,并且除了文字,注释和Javadoc用到单个空格,单个ASCII空格也出现在以下几个地方:

  • 分隔任何保留字与紧随其后的左括号( ( )(如 if, for catch 等)。
  • 分隔任何保留字与其前面的右大括号( } )(如 else, catch )。
  • 在任何左大括号前( { ),两个例外:
  1. @SomeAnnotation({a, b}) (不使用空格)。
  2. String[][] x = foo; (大括号间没有空格,见下面的Note)。
  • 在任何二元或三元运算符的两侧。这也适用于以下“类运算符”符号:
  1. 类型界限中的&( <T extends Foo & Bar> )。
  2. catch块中的管道符号( catch (FooException | BarException e )。
  3. foreach 语句中的分号。
  • 类型和变量之间:List list。
  • 数组初始化中,大括号内的空格是可选的,即 new int[] {5, 6} 和 new int[] { 5, 6} 都是可以的。

Note:这个规则并不要求或禁止一行的开关或结尾需要额外的空格,只对内部空格做要求。

说明:Google规约明确了空格使用场景,Google规约更加规范一些,部分规约条例已按照Alibaba规约拆分到其他条例,请继续参考本文其他内容。

正例:

// 运算符左右两边需要空格
int flag = 1;
// 关键词if与括号之间必须有一个空格,括号内的flag与左括号,0与右括号不需要空格,小括号和大括号之间有空格
if (flag == 0) {
    System.out.println(say);
}

反例:

// 运算符两侧没有空格
int flag=0;

// 关键词if与括号没有空格
if(flag == 0) {
    System.out.println(flag);
}

// flag和左括号之间有空格,0和右括号之间有空格
if ( flag == 0 ) {
    System.out.println(flag);
}

// 小括号和大括号之间无空格
if (flag == 0){
    System.out.println(flag);
}

3.禁止tab字符

Alibaba规约(强制

采用4个空格缩进,禁止使用tab字符。如果使用tab缩进,必须设置1个tab为4个空格。IDEA设置tab为4个空格时,请勿勾选Use tab character;而在eclipse中,必须勾选insert spaces for tabs。

Google规约

每当开始一个新的块,缩进增加2个空格,当块结束时,缩进返回先前的缩进级别。缩进级别适用于代码和注释。

说明:因为tab缩进在不同的操作系统上或在不同的编辑器下显示长短不一定,所以需要设置规则限制使用。IDEA设置tab参考路径 File - Settings - Editor - Code Style - Java - Tabs and indents ,eclipse 设置tab参考路径 Preferrence - Editor - Code Style - Text Editors 。

区别:Alibaba规约缩进采用4个空格,Google规约采用2个空格。个人感觉4个空格更美观。

正例:

// 函数中代码缩进4个空格
void doSomething() {
    System.out.println();
}

反例:

// if语句中代码块未缩进
if (flag == 1){
System.out.println(flag);
}

4.注释内容与双斜线需一个空格

Alibaba规约(强制

注释的双斜线与注释内容之间有且仅有一个空格。

Google规约

如果在一条语句后做注释,则双斜杠(//)两边都要空格。这里可以允许多个空格,但没有必要。

说明:区分注释内容和注释符号。(单独作为一条规定感觉有点夸大影响???)

补充:注意函数注释不能采用双斜线行注释,必须按照/**/注释且标识参数,双斜线注释一般作用于变量注释。

反例:

//这是示例注释,双斜线与注释内容
String param = new String();

5.强制转换时右括号与值不需要空格

Alibaba规约(强制

在进行类型强制转换时,右括号与强制转换值之间不需要任何空格隔开。

Google规约

未定义类似规范

说明:强制转换类型需要加小括号这时需要明确值,不使用空格可清晰辨识。

正例:

// 长整型符号L与数值无空格
long first = 1000000000000L; 
// int类型符号的右括号与数值无空格
int second = (int)first + 2;

反例:

// Math.pow(2, 10)为数值结果,int类型的右括号与它有空格
int result = (int) Math.pow(2, 10);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章