问题描述

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

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!

注意由双大括号匿名类引起的serialVersionUID编译告警的更多相关文章

  1. Java之匿名类讲解

    参考https://blog.csdn.net/jiaotuwoaini/article/details/51542059 匿名类,正如名字一样在java中没有名字标识的类,当然了编译后还是会安排一个 ...

  2. 浅谈Java的匿名类

    在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码 ...

  3. .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

    开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...

  4. Linq之隐式类型、自动属性、初始化器、匿名类

    目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...

  5. [改善Java代码]使用匿名类的构造函数

    建议39: 使用匿名类的构造函数 阅读如下代码,看看是否可以编译: public class Client { public static void main(String[] args) { Lis ...

  6. 【java】TreeSet、Comparable、Comparator、内部类、匿名类

    package com.tn.treeSet; public class Student { private String name; private int age; public Student( ...

  7. [转]c#匿名类

    首先让我们看一个例子, 假设我们并没有Person类, 并且我们关心的属性只有Name和Age. 下面的代码演示了我们如何在没有声明类型的情况下来构建一个对象的: 1: var tom = new { ...

  8. Second Day: 关于Button监听事件的三种方法(匿名类、外部类、继承接口)

    第一种:通过匿名类实现对Button事件的监听 首先在XML文件中拖入一个Button按钮,并设好ID,其次在主文件.java中进行控件初始化(Private声明),随后通过SetOnClickLis ...

  9. 学习笔记:因为java匿名类学习到接口的一些小用法

    在看CometD的示例代码时发现了许多有意思的代码,但说实话看别人的代码确实是件很累的事情,所以就看到这个知识点做一下记录吧.   先看一段代码: 代码1   这段代码中有一个new的操作,而且是在方 ...

随机推荐

  1. 《Java并发编程的艺术》笔记

    第1章 并发编程的挑战 1.1 上下文切换 CPU通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换. 减少上下文切换的方法有4种:无锁并发编程.CAS算法.使用最少线程.使 ...

  2. ubuntu下一键安装pptpd

    1 #!/bin/bash 2 # Quick and dirty pptp VPN install script 3 # Ubuntu 12+ or Debain 7+ 4 # Reference ...

  3. 怎样优雅的实现INotifyPropertyChanged

    第一 安装nuget包 PropertyChanged.Fody. 第二 在类的上方加上 [PropertyChanged.AddINotifyPropertyChangedInterface] 类似 ...

  4. Layman H5+Webapp+MUI App 页面滑至到底部自动加载新的内容

    要点:使用jquery的scroll()方法实现,当用户滚动指定的元素时,会发生 scroll 事件 scroll 事件适用于所有可滚动的元素和 window 对象(浏览器窗口) scroll() 方 ...

  5. Flutter 开发从 0 到 1(四)ListView 下拉加载和加载更多

    在<APP 开发从 0 到 1(三)布局与 ListView>我们完成了 ListView,这篇文章将做 ListView 下拉加载和加载更多. ListView 下拉加载 Flutter ...

  6. python反序列化学习记录

    pickle与序列化和反序列化 官方文档 模块 pickle 实现了对一个 Python 对象结构的二进制序列化和反序列化. "pickling" 是将 Python 对象及其所拥 ...

  7. FastJson解析Json,封装JavaBean对象

    获取到前端的Json,后台对应封装JavaBean对象,对其解析赋值 获取到前端的json,对其进行分析 1.获取最外层前端json对应得JavaBean (1)未分析格式的json串 (2)初步格式 ...

  8. Python基本语法之数据类型(总览)

    Python的八种数据类型 Number,数值类型 String,字符串,主要用于描述文本 List,列表,一个包含元素的序列 Tuple,元组,和列表类似,但其是不可变的 Set,一个包含元素的集合 ...

  9. 多测试_常用linux命令_002

    linux 介绍 常用的操作系统(os): windows .dos.android.ios.unix.linux linux系统:是一个免费.开源的操作系统 支持多cpu,多用户,多线程的操作系统, ...

  10. pyquery 匹配NavigableString

    pyquery 匹配NavigableString不像xpath那样精确找打匹配对象,只需匹配包含NavigableString的根节点