【问题标题】:Anonymous initialization - strange serialization warning [duplicate]匿名初始化 - 奇怪的序列化警告[重复]
【发布时间】:2011-10-25 19:31:19
【问题描述】:

我想知道为什么当我将匿名实例化与实例初始化程序块一起使用时,会收到“可序列化类未声明 long 类型的静态最终 serialVersionUID 字段”编译时警告。

这就是我的意思。假设我想实例化一个 ArrayList 并同时向它添加一些东西,如下所示:

ArrayList<Object> arrayList = new ArrayList<Object>(){{add(new Object());}}; 

如果我编译这一切都没问题,但我收到 serialVersionUID 字段丢失警告。现在 ArrayList 已经实现了可序列化并且有一个 private static final long serialVersionUID 那么为什么当我这样使用它时,该字段似乎“消失”并且我收到了没有声明它的警告?

【问题讨论】:

  • 这太傻了。今天很少有人使用 Java 序列化,这样的通用警告是没有根据的。而且我永远无法忘记 Eclipse 用户将 IDE 称为 不合格的编译器。
  • @irreputable 是不是有一些注释可以抑制这个?我的意思是,如果他们可以为未经检查的强制转换做到这一点,那么您肯定会期望像 UID 这样的东西可以忽略不计。
  • @irreputable:嗯,我不同意你声明的第一部分。序列化具有很好的界定用途。此外,如果您的实例位于应用服务器的 HttpRequest 对象中,并且该应用服务器决定钝化并序列化它,该怎么办?而关于 Eclipse 的部分我不明白。 Eclipse 可以使用编译器编译您的 Java 代码,您也可以在控制台中手动编译它(在这种情况下使用 -Xlint 来显示警告,我总是这样做)。你能澄清一下吗?
  • @irreputable - 仅仅因为不需要序列化和/或其高级功能并不意味着世界其他地方分享你的情怀。例如版本控制对于构建一个健壮的分布式系统很有用,其中不同的组件可能不会同时升级。

标签: java initialization anonymous-types


【解决方案1】:

当您创建匿名类时,实际上是在扩展 ArrayList,因此继承了 Serializable 接口。

所有Serializable 类都应该有一个serialVersionUID,以便您可以区分这些类的不同序列化版本。由于匿名类型是一个新类,因此最好给它一个 ID,以便区分它的不同版本。

【讨论】:

  • 知道了,所以这就像扩展 ArrayList 类,然后扩展类具有初始化块并调用“add”,但它是一个不同的类,它需要它自己的 serialVersionUID(因为它从 ArrayList 继承 Serializable)。这对我来说并不明显,因为我正在创建一个匿名类。
  • @AndreiBodnarescu 没错。匿名类只是用于创建从另一个类扩展的新类的语法糖(在您的情况下,ArrayList)。
  • @AndreiBodnarescu 准确地说。话虽如此,但不鼓励使用这种双括号语法进行集合启动,因为现在您并没有真正的 ArrayList 而是一些模糊的子类,这可能会在以后导致晦涩的问题。遇到这些问题的可能性可能不大,但是当您遇到这些问题时,这将是一个令人头疼的问题。它可能很冗长,但最好只编写所有 add() 语句或初始化一个数组,然后使用它创建列表。
【解决方案2】:

因为您正在创建本质上是子类的东西。这样的子类需要它自己的序列版本 UID。当您对 JPanel 之类的东西进行子类化时,也会发生同样的事情。如果您不需要(反)序列化,这不是一个可怕的问题。

【讨论】:

    【解决方案3】:
    new ArrayList<Object>() {
    
        {
            add(new Object());
        }
    
    };
    

    您不仅要实例化,还要先定义ArrayList 的子类(匿名),然后再实例化子类。

    即使ArrayList 中有一个private static final long serialVersionUID,由于它是静态,它不会被您的匿名子类继承。所以它缺少那个字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 2012-11-28
      • 2011-02-22
      相关资源
      最近更新 更多