养成好的java开发习惯,写出健壮的代码
养成好的java开发习惯,写出健壮的代码
前言
在我们开始慢慢写代码的时候,养成一些比较好的习惯,会让我们的代码更加的简洁,便于遇到,也会让代码的性能提升,接下来就会根据实际开发过程中,列举一些开发一些例子,做法来优化代码
调用低效的构造器,创建包装类型的对象
反例:
正解:
解惑:使用 Long.valueOf(long) 代替 new Long(long),可以提高性能。
在Long的底层源码中,可以看出在Long的范围-128到127之间,Long不会创建一个新的对象,而是在缓存中取出数字,在超过范围后才创建对象,我们使用Long的valueOf()方法,可以减少对象的创建,来减少内存的消耗
使用 keySet 迭代器迭代 Map,获取对应的 value
反例
正例
keySet 方式遍历 Map 的性能不如 entrySet 性能好。如果采用 keySet 的方式获取 Map 中 key,然后通过 key 获取 Map 对应的 value,如上图 HashMap 源码所示,每次都需要通过 key 去计算对应的 hash 值,然后再通过 hash 值获取对应的 value,效率会低不少。
所以如果想要获取
a)如果想获取 Map 对应的 key 和 value,则推荐使用 entrySet。
b)如果只是单纯获取 Map 对应的 key,则推荐使用 keySet。
使用 new Date().getTime() 获取当前时间戳。
反例
a)获取当前毫秒数采用 System.currentTimeMillis(),而不是new Date().getTime();
b)获取更加精确的纳秒级时间值,采用 System.nanoTime;
c)在 JDK8 中,针对统计时间等场景,建议使用 Instant 类。
循环中使用 ”+“ 号拼接字符串
在循环拼接字符串的使用,要使用StringBuffer或者StringBuilder,其有缓存池,如果使用String的 + 拼接话,虽然底层是使用StringBuilder来拼接的,但是会在内存中字符串常量池中生成新的字符串,拼接一次生成一次,比较浪费空间
使用 switch 时,缺失 default
采用 switch 时,当所有 case 都不匹配时,会走 default 逻辑。为了程序更完成、更优雅,在一个 switch 块内,都必须包含一个 default 语句并且放在最后,即使它什么代码也没有。
记录日志时,缺失参数。
正解:
- 日志打印时,占位符 {} 要严格与参数相对应,如果对应不上,按照截图示意,日志输出则不会打印 queryString 的参数,会直接输出 {},但是某些版本下会出现空指针异常。
- 日志不需要到处记录,但是重要的参数必要要记录日志,这样后期线上bug比较容易查出问题,比如出参,入参
删除多余代码,
在我们开发完成后,常常会对代码优化,所以在优化后去掉这些闲置不用的对象,若留着就是耗内存,而且影响雅观,不用的变量、代码段建议删除。
这些重复的代码建议将其优化掉,抽取出来成为一个方法,使用的时候调用即可,这样子即简洁,又方便使用
判null
在开发中最常出现的bug就是空指针了,所以我们在开发过程中,对于出参和入参需要进行判断,防止空指针报错;这些判断需要根据业务和实际情况,来判null,比如入参的参数带入数据库中查询,这种需要判断,不然带进去会报错;
字符串的判断,建议使用 字符串.equals(变量)
多余的 if/else
类似上面这种写法,if/else 就显得有点高射炮打蚊子,不如使用
addBool = (i == 0);
使用工具类
Apache Commons 下面的工具包,用熟了,确实很香。
完成对象间的属性 Copy,编写冗长的代码
... ...
batchEntity.setNotifyType(batchEntityOld.getNotifyType());
batchEntity.setUpdatedTime(batchEntityOld.getUpdatedTime());
batchEntity.setBizType(batchEntityOld.getBizType());
batchEntity.setMerchId(batchEntityOld.getMerchId());
... ...
修改:
方式 1:采用 Apache BeanUtils 完成属性赋值。
BeanUtils.copyProperties(batchEntityOld,batchEntity);
方式 2:采用 Spring BeanUtils 完成属性赋值。
BeanUtils.copyProperties(batchEntity,batchEntityOld);
BigDecimal来计算金额
在开发中必不可少会使用金额运算的,如果这时候使用double运算的话,会出现金额不准确,各种小数;这是因为double底层使用的二进制计算的,跟我们正常的十进制计算有差别,所以结果有差距,所以这里建议使用BigDecimal;
注:
BigDecimal的底层构造方法是没有判null的,所以传入值为null的话可能报错,需要注意
int长度不够
public static long convertDaysToMilliseconds(int days) {
return 1000 * 3600 * 24 * days;
}
分析:
1000 * 3600 * 24 * days 结果默认为 int 类型,最大值为 2147483647,如果超过 int 范围,则会出现截断,程序不会出错,但是结果却匪夷所思。
在我们开发的时候int是最常用的数字类型了,但是在使用的时候我们需要考虑其长度是否够满足我们的业务需求,不然出现截断问题,就很麻烦了,太长的数字或者无法判断其过长 建议使用long类型
上一篇: PHP重定向的具体实现方式_PHP教程