开发规范是所有程序员开发过程中必须掌握的技能,早期的软件开发过程可能不重视开发规范导致后期维护成本极高,现在国内的大厂都会制定自己的开发规范,完善的开发规范不仅可以提高团队效率,还可以避免很多意外的bug问题。下面我找了几篇关于代码规范重要性的文章,大家可以参考下。
本系列文章将整合 阿里巴巴《Java开发手册》 和 谷歌《Java编程规范》 ,总结Java开发过程的编码规范,并通过具体编码案例给出编码规范的原因,如果总结内容存在问题还望指出。
Java开发规范之OOP规约篇共上中下三篇,具体内容参考 阿里巴巴《Java开发手册》的目录,同时补充 谷歌《Java编程规范》的内容,阿里巴巴规约内容比较丰富,谷歌规约很多实际内容都没有。
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)含义不够了解,请参考第一篇文章介绍内容。
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规约
未明确定义类似规范
说明:同名方法一般是相同业务逻辑但参数不同,因此放在一起增加可读性,让后人查看不至于漏掉关键信息。
Alibaba规约(推荐)
类内方法定义的顺序依次是:公有方法或保护方法 > 私有方法 > getter / setter 方法。
Google规约
未明确定义类似规范
说明:公有方法是类的调用者和维护者最关心的方法,首屏展示最好;保护方法虽然只是子类关心,也可能是“模板设计模式”下的核心方法;而私有方法外部一般不需要特别关心,是一个黑盒实现;因为承载的信息价值较低,所有Service和DAO的getter/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;
}
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";
}
Alibaba规约(推荐)
final可以声明类、成员变量、方法、以及本地变量,下列情况使用final关键字:
- 不允许被继承的类,如:String类。
- 不允许修改引用的域对象。
- 不允许被覆写的方法,如:POJO类的setter方法。
- 不允许运行过程中重新赋值的局部变量。
- 避免上下文重复使用一个变量,使用final可以强制重新定义一个变量,方便更好地进行重构。
Google规约
未明确定义类似规范
说明:final 在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦引用声明作final,将不能改变这个引用了,编译器会检查代码,如果试图将变量再次初始化的话,编译器会报编译错误。final 关键字有以下作用:
Alibaba规约(推荐)
慎用Object的clone方法来拷贝对象。
Google规约
未明确定义类似规范
说明:对象clone方法默认是浅拷贝,若想实现深拷贝需覆写clone方法实现域对象的深度遍历式拷贝。
Alibaba规约(推荐)
类成员与方法访问控制从严:
- 如果不允许外部直接通过new来创建对象,那么构造方法必须是private。
- 工具类不允许有public或default构造方法。
- 类非static成员变量并且与子类共享,必须是protected。
- 类非static成员变量并且仅在本类使用,必须是private。
- 类static成员变量如果仅在本类使用,必须是private。
- 若是static成员变量,考虑是否为final。
- 类成员方法只供类内部调用,必须是private。
- 类成员方法只对继承类公开,那么限制为protected。
Google规约
未明确定义类似规范
说明:任何类、方法、参数、变量,严控访问范围。过于宽泛的访问范围,不利于模块解耦。思考:如果是一个private的方法,想删除就删除,可是一个public的service成员方法或成员变量,删除一下,不得手心冒点汗吗?变量像自己的小孩,尽量在自己的视线内,变量作用域太大,无限制的到处跑,那么你会担心的。