Java开发规范之OOP规约篇(下)

开发规范是所有程序员开发过程中必须掌握的技能,早期的软件开发过程可能不重视开发规范导致后期维护成本极高,现在国内的大厂都会制定自己的开发规范,完善的开发规范不仅可以提高团队效率,还可以避免很多意外的bug问题。下面我找了几篇关于代码规范重要性的文章,大家可以参考下。

  1. 为什么谷歌要执行严格的代码编写规范
  2. 为什么要写软件开发规范?软件开发规范书怎么写?
  3. 为什么在程序开发中要注意编码规范?(知乎问答)

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


Java开发规范之OOP规约篇共上中下三篇,具体内容参考 阿里巴巴《Java开发手册》的目录,同时补充 谷歌《Java编程规范》的内容,阿里巴巴规约内容比较丰富,谷歌规约很多实际内容都没有。

  1. Java开发规范之OOP规约篇(上)
  2. Java开发规范之OOP规约篇(中)
  3. Java开发规范之OOP规约篇(下)

Java开发规范之OOP规约篇(下)

17.String的split方法需作空检查

18.类的同名方法需要顺序放在一起

19.类内方法定义的顺序 public / protected > private > getter / setter

20.setter方法中参数名称与类成员变量名称一致

21.字符串的拼接使用StringBuilder的append方法

22.final关键字使用标准

23.避免使用Object的clone方法拷贝对象

24.类成员与方法访问控制标准


本篇文章内容将承接上一篇  《Java开发规范之OOP规约篇(中)》  继续介绍面向对象程序设计中规范,如果OOP (Object Oriented Programming)含义不够了解,请参考第一篇文章介绍内容。

17.String的split方法需作空检查

Alibaba规约(推荐

使用索引访问用String的split方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛IndexOutOfBoundsException 异常的风险。

Google规约

未明确定义类似规范

说明:str字符串中包含多个元素,被逗号分隔,但最后两个逗号后无内容,本来是想挑出a,b,c,null,null,但实际结果有差错,如果使用array[4]访问第五个元素就存在问题。

String str = "a,b,c,,";
String[] array = str.split(",");
// 预期大于3,结果是3
System.out.println(array.length);

正例:

String str = "a,b,c,,";
String[] array = str.split(",");
for (int i = 0; i < 5; i++) {
    // 内容检查
    if (array[i] != null){
        System.out.println(array[i]);
    }
}

18.类的同名方法需要顺序放在一起

Alibaba规约(推荐

当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读,此条规则优先于下一条。

Google规约

未明确定义类似规范

说明:同名方法一般是相同业务逻辑但参数不同,因此放在一起增加可读性,让后人查看不至于漏掉关键信息。

19.类内方法定义的顺序 public / protected > private > getter / setter

Alibaba规约(推荐

类内方法定义的顺序依次是:公有方法或保护方法 > 私有方法 > getter / setter 方法。

Google规约

未明确定义类似规范

说明:公有方法是类的调用者和维护者最关心的方法,首屏展示最好;保护方法虽然只是子类关心,也可能是“模板设计模式”下的核心方法;而私有方法外部一般不需要特别关心,是一个黑盒实现;因为承载的信息价值较低,所有Service和DAO的getter/setter方法放在类体最后。

 

20.setter方法中参数名称与类成员变量名称一致

Alibaba规约(推荐

setter方法中,参数名称与类成员变量名称一致,this.成员名 = 参数名。在getter/setter方法中,不要增加业务逻辑,增加排查问题的难度。

Google规约

未明确定义类似规范

说明:setter方法是用来设置成员变量,按照该规则可以避免低级问题。

正例:

public void setName(String name) {
	this.name = name;
}

public void setAge(Integer age) {
	this.age = age;
}

反例:

public void setName(String str) {
	this.name = str;
}

public void setAge(Integer num) {
	this.age = num;
}

21.字符串的拼接使用StringBuilder的append方法

Alibaba规约(推荐

循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展。

Google规约

未明确定义类似规范

说明:如果直接使用 + “123” 方法都会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回String对象,造成内存资源浪费。

正例:

StringBuilder str = new StringBuilder("start");
for (int i = 0; i < 100; i++) {
	str.append("hello");
}

反例:

String str = "start";
for (int i = 0; i < 100; i++) {
    str = str + "hello";
}

22.final关键字使用标准

Alibaba规约(推荐

final可以声明类、成员变量、方法、以及本地变量,下列情况使用final关键字:

  •  不允许被继承的类,如:String类。
  •  不允许修改引用的域对象。
  •  不允许被覆写的方法,如:POJO类的setter方法。
  •  不允许运行过程中重新赋值的局部变量。
  • 避免上下文重复使用一个变量,使用final可以强制重新定义一个变量,方便更好地进行重构。

Google规约

未明确定义类似规范

说明:final 在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦引用声明作final,将不能改变这个引用了,编译器会检查代码,如果试图将变量再次初始化的话,编译器会报编译错误。final 关键字有以下作用:

  • 修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值;
  • 修饰方法参数,表示在变量的生存期中它的值不能被改变;
  • 修饰方法,表示该方法无法被重写;
  • 修饰类,表示该类无法被继承。

23.避免使用Object的clone方法拷贝对象

Alibaba规约(推荐

慎用Object的clone方法来拷贝对象。

Google规约

未明确定义类似规范

说明:对象clone方法默认是浅拷贝,若想实现深拷贝需覆写clone方法实现域对象的深度遍历式拷贝。

24.类成员与方法访问控制标准

Alibaba规约(推荐

类成员与方法访问控制从严:

  • 如果不允许外部直接通过new来创建对象,那么构造方法必须是private。
  • 工具类不允许有public或default构造方法。
  • 类非static成员变量并且与子类共享,必须是protected。
  • 类非static成员变量并且仅在本类使用,必须是private。
  • 类static成员变量如果仅在本类使用,必须是private。
  •  若是static成员变量,考虑是否为final。
  • 类成员方法只供类内部调用,必须是private。
  •  类成员方法只对继承类公开,那么限制为protected。

Google规约

未明确定义类似规范

说明:任何类、方法、参数、变量,严控访问范围。过于宽泛的访问范围,不利于模块解耦。思考:如果是一个private的方法,想删除就删除,可是一个public的service成员方法或成员变量,删除一下,不得手心冒点汗吗?变量像自己的小孩,尽量在自己的视线内,变量作用域太大,无限制的到处跑,那么你会担心的。

你可能感兴趣的:(Java开发规范,Java基础)