以下问题安装sonarLint可以绝大部分避免!
- equals,尽量将已知常量放在前面,更推荐使用Objects工具类来进行对象的equals比较
//错误示列
Integer a1 = 128;
Integer a2 = 128;
System.out.println(a1 == a2);
//正确示列
Integer a3 = 128;
Integer a4 = 128;
System.out.println(Objects.equals(a3,a4));
- 尽量以此方式来抛出异常
Assert.notNull('执行判断的变量','要抛出的错误内容');
- 尽量避免for循环select
//错误示列
List<Long> ids = new ArrayList<>();
ids.forEach(id->{
investigateHeaderRepository.selectByPrimaryKey(id);
});
//正确示列
investigateHeaderRepository.selectByIds(ids.stream().map(Objects::toString).collect(Collectors.joining(",")));
- 头行查询可以考虑使用resultMap做映射
<resultMap id="test" type="头路径">
<!--头字段信息
.......
-->
<!--行映射 -->
<collection property="属性名称" ofType="行路径"
javaType="type">
<!-- 行字段信息
....
-->
</collection>
</resultMap>
- 已知Hash map,String Builder等类似其内容数量,可以直接定义好初始大小
Map<String, String> reportMap = new HashMap<>(BaseConstants.Digital.TWO);
从源码分析中可以得知hash map 的扩容机制如果在最开始就指定hash map 的大小可以避免其底层不断的扩容
- 比较简单的if else赋值 可以直接使用三元运算符去赋值
@Test
public void test(Integer a ) {
int b;
if (a==null){
b=1;
}else {
b=2;
}
b = ObjectUtils.isEmpty(a) ? 1 : 2;
}
- 过于lambdat 使用的distinct()
List<Integer> investigateTmplate = prices.stream().map(PriceDTO::getId).distinct().collect(Collectors.toList());
//性能差距和第一种方式较为明显提升
Set<Integer> collect = prices.stream().map(PriceDTO::getId).distinct().collect(Collectors.toSet());
- 关于for循环获取size
for (int i = 0; i < prices.size(); i++)
//可以避免循环中去获取size
int size = prices.size();
for (int i = 0; i < size; i++) { }
- 尽量避免随意的定义需要回收的变量为静态变量,慎写静态的方法,在多线程调用的情况下会出现并发问题
如services调用实体里写的某一个方法而这个方法里没去避免并发调用出现的问题,也请慎用synchronized
- 接口和方法尽量要有一个良好的命名,参数说明,接口说明!
/**
* 批量确定并发布调查表
* @param tenantId 租户ID
* @param investigateHeaderList 调查表头
* @return 调查表头
*/
List<InvestigateHeader> batchSaveAndReleaseInvestigate(Long tenantId,List<InvestigateHeader> investigateHeaderList);
-
尽量让代码不要过高耦合,将逻辑细分拆成好的行为方法,让后续维护的人可以快速上手,尽量前期在书写会被复用的代码时就先将其写好可以共用!
-
如果要将一个基本数据类型转换为字符串推荐使用toString比起String.valueOf()会略快
args.put(FIELD_ORGANIZATION_ID, investigateHeader.getPartnerTenantId() + "");
- 针对NullPointerException,数组越界异常,转换异常等类似,尽量在开发中就去规避它
-
循环体内不要使用"+"进行字符串拼接,尽可能使用StringBuilder去不断append但如果是常亮字符串无需拼接不要使用StringBuffer等,因常量字符串并不需要动态改变长度。
-
事物
一段dml 不能落下事物,在必要时要注意事物的传播行为!
spring中this调用的事物会存在失效,因JDK的动态代理,在SpringIoC容器中返回的调用的对象是代理对象而不是真实的对象,只有被动态代理直接调用的才会产生事务。
可以去实现AopProxy来解决此类问题 然后改成this.self().方法()其底层原理为获取this对象的动态代理对象!
网友评论