Bad Java

概述

这里列举了一些可以称之为愚蠢/低效的 java 代码,绝非无中生有,全部是从项目里找到的。我称之为 bad java

在这里示众的目的,是希望每一位读者能吸取教训,在自己的编程实践中避免写出 bad java

莫名其妙

这是一些莫名其妙的代码

if 判断

谁能告诉我这里面的 if 代码块有神马用?

private byte[] getDataFromRedisInBytes(String redisKey, Object... keyArgs) {
    byte[] resultDataInBytes = redisClient.get(String.format(redisKey, keyArgs).getBytes());
    if (resultDataInBytes != null) {
        return resultDataInBytes;
    } else {
        return null;
    }
}

list

修改list的元素

18 行是在干嘛?

思考一下,下面代码会打印出什么来

创建 list

在第 9 行,通过创建一个匿名内部类的方式创建了一个 list,但这样会导致 ide 报警,所以在方法前使用了压制报警的注解 @SuppressWarnings("serial")

而且,代码看起来也很臃肿

试试下面这种写法

log

第 7 行,打印异常堆栈,第 8 行,将异常向外抛出......那么第 7 行的必要性就可以商榷了,会导致什么后果?

  • 异常日志会更臃肿

  • 如果根据日志文件进行异常数量统计,那么统计出来的数据不准确,虚高

如果想要在这里打印一些调试信息,不应该使用 error 级别,更好的做法是将想要打印的调试信息作为 BizException 的 message 属性

transaction

数据库事务需要对表/记录加锁,其他需要访问被加锁数据的事务就要等待锁的释放。可见,提高性能的关键是以最快的速度完成事务,要达成这个目的,我们应该在事务之前完成所有前置操作,以及在事务之后完成所有后续操作,而不应将非数据库操作放在事务里。

上传文件

注意第 29 行,在事务里上传文件到小文件系统,很明显应该先上传文件获得文件 url,再开始事务

发送 mq 消息

注意最后 2 行,在事务里发送 mq 消息,很明显应该先提交事务,再发送 mq 消息

无谓的开启事务

看下面代码,启动事务以后,判断传入参数videoPackList.size(),如果为 0 就退出事务......为毛不在事务启动前判断?这样很有可能会启动事务然后啥也不干就退出,对数据库来说开一个事务可不是个小负担

参数处理

by value or by ref

Java manipulates objects 'by reference,' but it passes object references to methods 'by value.'

来自于 Does Java pass by reference or pass by value?arrow-up-right

先看代码片段 1

这段代码,将 albumPack 的 album 成员交给 youkuStoreHelper,调用 handlerAlbum 进行处理,返回一个新的 album 后,将 albumPack 的 album 成员设置为这个返回值

再看看代码片段 2

我们看下 handleAlbum 在做什么

我们发现 handleAlbum 在对传入的 album 进行了一系列操作后,并没有 new 一个 album 返回,而是直接将这个传入的 album 返回了

那么我不禁要问一下,在代码片段 1 里,将返回的 album 重新 set 到 albumPack 的意义在哪里?

本质上,这个问题和前述里修改 list 的元素 是一样的

类型转换

Object 转 String

把一个对象转换成 String,为毛不用toString()方法?

原始数据类型转 String

Last updated