注意由双大括号匿名类引起的serialVersionUID编译告警
2024-09-03 23:23:33
问题描述
最近版本组织清理编译告警,其中有这么一条比较有意思,之前没见过,拿出来说一说
“serializable class anonymous com.demo.Main$1 has no definition of serialVersionUID”
编译告警指向了这段代码:
private static List<String> defaultAttrList = new ArrayList<String>() {
{
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<String> {
Main$1() {
this.add("1");// 10
}// 11
}
可以看到,我们创建了一个名为Main$1
的匿名类,继承自ArrayList
,而ArrayList
的类定义如下:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable {
// ......
}
正是因为ArrayList
实现了Serializable
接口,所以Main$1
也需要定义serialVersionUID
。
解决方法
既然是由于匿名类引起的编译告警,我们可以干掉匿名类,用静态域来初始化List
,像下面这样即可消除告警:
private static List<String> defaultAttrList = new ArrayList<>();
static {
defaultAttrList.add(ResourceConsts.RES_NAME);
defaultAttrList.add(ResourceConsts.RES_TYPE);
defaultAttrList.add(ResourceConsts.RES_IP);
defaultAttrList.add(ResourceConsts.RES_VERSION);
}
参考资料
最新文章
- 【LeetCode】#344 Reverse String
- 002. Centos7安装mysql5.5.37
- hdu 5944 Fxx and string
- CentOS 命令模式下设置静态IP
- Sharepoint2012 Report权限
- MYSQL C API : CLIENT_MULTI_STATEMENTS 选项
- struts2 <;s:property/>;标签的使用--输出时间格式转换
- JS之tagNaem和nodeName
- eclipse下创建maven工程
- Java数据结构与算法(20) - ch08树
- 横截面数据分类——基于R
- linux_通配符
- 学会使用box-sizing布局
- Jquery 相关笔记
- 用UpdateResource修改EXE文件图标(已修正)
- c# 多态 虚方法
- Python的双向链表实现
- Blender模拟全局照明的简单方法
- week8:个人博客作业
- 使用newScheduledThreadPool来模拟心跳机制