java匿名类大括号,注意由双大括号匿名类引起的serialVersionUID编译告警

问题描述

最近版本组织清理编译告警,其中有这么一条比较有意思,之前没见过,拿出来说一说

“serializable class anonymous com.demo.Main$1 has no definition of serialVersionUID”

编译告警指向了这段代码:

private static List defaultAttrList = new ArrayList() {

{

add(ResourceConsts.RES_NAME);

add(ResourceConsts.RES_TYPE);

add(ResourceConsts.RES_IP);

add(ResourceConsts.RES_VERSION);

}

};

乍一看好像没什么问题,我用双大括号的方式定义并初始化了一个ArrayList,往里面塞了几个值,代码简洁易懂。

但问题并没有看起来那么简单,原因就在双大括号。

探究

双大括号的写法实际上创建了一个匿名类,我们将源文件编译后也会发现,生成了一个Main$1.class的文件,它就对应这个匿名类。反编译后的代码如下:

class Main$1 extends ArrayList {

Main$1() {

this.add("1");// 10

}// 11

}

可以看到,我们创建了一个名为Main$1的匿名类,继承自ArrayList,而ArrayList的类定义如下:

public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, Serializable {

// ......

}

正是因为ArrayList实现了Serializable接口,所以Main$1也需要定义serialVersionUID。

解决方法

既然是由于匿名类引起的编译告警,我们可以干掉匿名类,用静态域来初始化List,像下面这样即可消除告警:

private static List defaultAttrList = new ArrayList<>();

static {

defaultAttrList.add(ResourceConsts.RES_NAME);

defaultAttrList.add(ResourceConsts.RES_TYPE);

defaultAttrList.add(ResourceConsts.RES_IP);

defaultAttrList.add(ResourceConsts.RES_VERSION);

}

参考资料

永远不要使用双花括号初始化实例,否则就会OOM!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值