编程规范

321 阅读2分钟

1.单个方法参数不可超过5个。

2.单个方法行数不可超过60。

3.单个类行数不可超过2000。

4.命名需贴合语意。

5.方法中断言避免以下头重脚轻的场景:

public String handlePerson(Person person) { if (!checkPerson(person)) { ... ... ... ... return person.getName(); } return null; } 推荐写法: public boolean handlePerson(String name) { if (checkPerson(person)) { return null; } ... ... ... ... return person.getName(); } 循环中同理。

6.调用外部服务,需新建proxy类,并封装外部服务的逻辑,解耦外部服务。

7.调用mapper,需新建repository类,原因同上。

8.在分层结构中,严格按照层级职责编码,避免向上跨层调用,例如service层调controller层。

9.业务中的类型,状态等字段需提供与数据库设计匹配的枚举类。

10.避免代码中出现魔术值,可定义变量或包装类。

11.需多写注释,核心逻辑、抽象方法必须注释。

两种注释写法: 类属性,方法和类的注释: /** * 这是类属性,方法和类的注释. * */ 行注释: // 这是行注释.

12.避免代码复制粘贴,重复代码需重构,don't repeat yourself。

13.对象比较避免用==(事实相等,引用地址比较),用equals(逻辑相等,比较hashcode),equals尽量把常量或非空值放前面(null safe)。

14.避免循环套循环做条件查找:

例如查找人的省份:
for (Person person : personList) {
	for (Province province : provinceList) {
		if (province.getCode().equals(person.getProvinceCode())) {
			System.out.println(province.getName());
		}
	}
}
推荐写法:
Map<String,String> provinceMap = provinceList.stream().collect(Collectors.toMap((i) -> i.getCode(), (i) -> i.getName(), (i1, i2) -> i2));
for (Person person : personList) {
	System.out.println(provinceMap.get(person.getProvinceCode()));
}

15.HashMap初始化尽量给定初始容量((int) ((float) expectedSize / 0.75F + 1.0F)) 或使用com.google.common.collect.Maps#newHashMapWithExpectedSize,减少扩容开销,StringBuffer/StringBuilder类似。

16.避免循环中连接数据库或调用外部服务,尽量做批量操作,减少网络开销。

17.慎用copyProperties,基础类型包装类拷基础类型有NullPointerException风险,泛型变量对拷有ClassCastException风险,编译期并不会暴露。

18.非核心业务如记日志等可以放到异步任务中执行。