其实每一个项目都会有自己的开发规范,不管是前端还是后端,从类名,方法,变量名称 等都会有一定规范性,良好的代码规范对项目的开发及维护往往能让我们避免一些低级错误.
最近项目想要管理的更规范性写,所以及脑子一热,想在这里记录一下,
哈哈哈哈哈哈,这篇文章会持续更新。。。。。。。。。。。。。。。。。。
- 方法设计
- 【推荐】返回值可以为Null,可以考虑使用JDK8的Optional类**
不强制返回空集合,或者空对象。但需要添加注释充分说明什么情况下会返回null值。
防止NPE是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败、序列化失败、运行时异常等场景返回null的情况。
JDK8的Optional类的使用这里不展开。
- 【推荐】不能使用有继承关系的参数类型来重载方法**
因为方法重载的参数类型是根据编译时表面类型匹配的,不根据运行时的实际类型匹配。
class A {
void hello(List list);
void hello(ArrayList arrayList);
}
List arrayList = new ArrayList();
// 下句调用的是hello(List list),因为arrayList的定义类型是List
a.hello(arrayList);
- 【推荐】方法的长度度量
方法尽量不要超过100行,或其他团队共同商定的行数。其实当一个方法写的过于臃肿时,那就需要提取方,尽量多提方法,将主方法精简明了,
另外,方法长度超过8000个字节码时,将不会被JIT编译成二进制码。
- 【推荐】不使用
@Deprecated
的类或方法
接口提供方既然明确是过时接口并提供新接口,那么作为调用方来说,有义务去考证过时方法的新实现是什么。
比如java.net.URLDecoder 中的方法decode(String encodeStr) 这个方法已经过时,应该使用双参数decode(String source, String encode)。
类设计
- 【强制】所有的子类覆写方法,必须加
@Override
注解
比如有时候子类的覆写方法的拼写有误,或方法签名有误,导致没能真正覆写,加`@Override`可以准确判断是否覆写成功。
而且,如果在父类中对方法签名进行了修改,子类会马上编译报错。
另外,也能提醒阅读者这是个覆写方法。
最后,建议在IDE的Save Actions 中配置自动添加`@Override`注解,如果无意间错误同名覆写了父类方法也能被发现。
idea 开发工具 可以使用 Save Actions插件来进行代码的格式及注解的自动添加
- 【推荐】 减少类之间的依赖
比如如果A类只依赖B类的某个属性,在构造函数和方法参数中,只传入该属性。让阅读者知道,A类只依赖了B类的这个属性,而不依赖其他属性,也不会调用B类的任何方法。
控制语句
- 【强制】if, else, for, do, while语句必须使用大括号,即使只有单条语句
曾经试过合并代码时,因为没加括号,单条语句合并成两条语句后,仍然认为只有单条语句,另一条语句在循环外执行。
其他增加调试语句等情况也经常引起同样错误。
可在IDE的Save Action中配置自动添加。
if (a == b) {
...
}
- 【推荐】限定方法的嵌套层次**
所有if/else/for/while/try的嵌套,当层次过多时,将引起巨大的阅读障碍,因此一般推荐嵌套层次不超过4。
通过抽取方法来减少嵌套。
- 【推荐】表达式中,能造成短路概率较大的逻辑尽量放前面,使得后面的判断可以免于执行
if (mayTrue() || mayFalse()) { ... }
if (mayFalse() && mayTrue()) { ... }
基本类型与字符串
- 数值equals比较的原则
1.1. 强制】 所有包装类对象之间值的比较,全部使用equals方法比较
==判断对象是否同一个。Integer var = ?在缓存区间的赋值,会复用已有对象,因此这个区间内的Integer使用 ==进行判断可通过,
但是区间之外的所有数据,则会在堆上新产生,不会通过。因此如果用== 来比较数值,很可能在小的测试数据中通过,而到了生产环境才出问题。
1.2. 【强制】 BigDecimal需要使用compareTo()
因为BigDecimal的equals()还会比对精度,2.0与2.00不一致。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
ps:人生就像一场戏,没有彩排,没有台本,而主演就是自己