问题描述

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

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);
}

参考资料

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

最新文章

  1. 【LeetCode】#344 Reverse String
  2. 002. Centos7安装mysql5.5.37
  3. hdu 5944 Fxx and string
  4. CentOS 命令模式下设置静态IP
  5. Sharepoint2012 Report权限
  6. MYSQL C API : CLIENT_MULTI_STATEMENTS 选项
  7. struts2 &lt;s:property/&gt;标签的使用--输出时间格式转换
  8. JS之tagNaem和nodeName
  9. eclipse下创建maven工程
  10. Java数据结构与算法(20) - ch08树
  11. 横截面数据分类——基于R
  12. linux_通配符
  13. 学会使用box-sizing布局
  14. Jquery 相关笔记
  15. 用UpdateResource修改EXE文件图标(已修正)
  16. c# 多态 虚方法
  17. Python的双向链表实现
  18. Blender模拟全局照明的简单方法
  19. week8:个人博客作业
  20. 使用newScheduledThreadPool来模拟心跳机制

热门文章

  1. C++ (C#)实现获取NX PART预览图
  2. jpeg编解码概述
  3. python3-day3
  4. SpringMVC自定义日期转换器
  5. 03 ArcPython实战篇一
  6. 日常使用 ADB 命令
  7. xxe 新手学习记录
  8. 云原生 go-zero 微服务框架
  9. centos7.5安装gcc7.2.0
  10. 使用Spring Boot创建docker image