欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

养成好的java开发习惯,写出健壮的代码

程序员文章站 2024-01-25 16:30:10
...

前言

在我们开始慢慢写代码的时候,养成一些比较好的习惯,会让我们的代码更加的简洁,便于遇到,也会让代码的性能提升,接下来就会根据实际开发过程中,列举一些开发一些例子,做法来优化代码

调用低效的构造器,创建包装类型的对象

反例:养成好的java开发习惯,写出健壮的代码
正解:
养成好的java开发习惯,写出健壮的代码
解惑:使用 Long.valueOf(long) 代替 new Long(long),可以提高性能。
养成好的java开发习惯,写出健壮的代码
在Long的底层源码中,可以看出在Long的范围-128到127之间,Long不会创建一个新的对象,而是在缓存中取出数字,在超过范围后才创建对象,我们使用Long的valueOf()方法,可以减少对象的创建,来减少内存的消耗

使用 keySet 迭代器迭代 Map,获取对应的 value

反例
养成好的java开发习惯,写出健壮的代码
正例
养成好的java开发习惯,写出健壮的代码
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() 获取当前时间戳。

反例
养成好的java开发习惯,写出健壮的代码

a)获取当前毫秒数采用 System.currentTimeMillis(),而不是new Date().getTime();

b)获取更加精确的纳秒级时间值,采用 System.nanoTime;

c)在 JDK8 中,针对统计时间等场景,建议使用 Instant 类。

循环中使用 ”+“ 号拼接字符串

养成好的java开发习惯,写出健壮的代码
在循环拼接字符串的使用,要使用StringBuffer或者StringBuilder,其有缓存池,如果使用String的 + 拼接话,虽然底层是使用StringBuilder来拼接的,但是会在内存中字符串常量池中生成新的字符串,拼接一次生成一次,比较浪费空间

使用 switch 时,缺失 default

养成好的java开发习惯,写出健壮的代码
采用 switch 时,当所有 case 都不匹配时,会走 default 逻辑。为了程序更完成、更优雅,在一个 switch 块内,都必须包含一个 default 语句并且放在最后,即使它什么代码也没有。

记录日志时,缺失参数。

养成好的java开发习惯,写出健壮的代码
正解:

  1. 日志打印时,占位符 {} 要严格与参数相对应,如果对应不上,按照截图示意,日志输出则不会打印 queryString 的参数,会直接输出 {},但是某些版本下会出现空指针异常。
  2. 日志不需要到处记录,但是重要的参数必要要记录日志,这样后期线上bug比较容易查出问题,比如出参,入参

删除多余代码,

养成好的java开发习惯,写出健壮的代码

在我们开发完成后,常常会对代码优化,所以在优化后去掉这些闲置不用的对象,若留着就是耗内存,而且影响雅观,不用的变量、代码段建议删除。
养成好的java开发习惯,写出健壮的代码
这些重复的代码建议将其优化掉,抽取出来成为一个方法,使用的时候调用即可,这样子即简洁,又方便使用

判null

养成好的java开发习惯,写出健壮的代码

在开发中最常出现的bug就是空指针了,所以我们在开发过程中,对于出参和入参需要进行判断,防止空指针报错;这些判断需要根据业务和实际情况,来判null,比如入参的参数带入数据库中查询,这种需要判断,不然带进去会报错;
字符串的判断,建议使用 字符串.equals(变量)
养成好的java开发习惯,写出健壮的代码

多余的 if/else

养成好的java开发习惯,写出健壮的代码
类似上面这种写法,if/else 就显得有点高射炮打蚊子,不如使用
addBool = (i == 0);

使用工具类

Apache Commons 下面的工具包,用熟了,确实很香。

养成好的java开发习惯,写出健壮的代码

完成对象间的属性 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类型

相关标签: java