gpt4 book ai didi

java - @SuppressWarnings ("serial")

转载 作者:太空狗 更新时间:2023-10-29 22:31:31 27 4
gpt4 key购买 nike

我有一个问题,因为我有点困惑(或者我没有注意到一些明显的事情)。假设我有一些包含很多类的源代码,这些类包含大量像这样定义的静态字段:

public final class ConverterTYPE  {
private final static HashMap<String, Byte> STRING_MAP = new HashMap<String, Byte>() {
{
put("A", new Byte((byte)12));
put("B", new Byte((byte)13));
}
};

}

众所周知,静态字段不会被序列化。

但是,Java(和 Eclipse)提示“可序列化类没有声明 long 类型的静态最终 serialVersionUID 字段”。为什么他们不能注意到 static 不会被序列化?

下一个问题:使用 @SuppressWarnings("serial") 是否是解决此问题的正确方法?摆脱所有此类警告?

编辑:

我的类都没有实现 Serializable 接口(interface)(或者它们的父类(super class)都没有)。 Eclipse 指向 HashMap<String, Byte>及其警告。为什么它检测不到它是静态字段?

最佳答案

仅仅因为该字段可能不会被序列化并不意味着它引用的东西本身永远不会被序列化!其他人/事物可以获得对该映射的引用并尝试直接对其进行序列化,或者将其用作可序列化类中的实例成员等。我看到它是私有(private)的,但要确保它永远不会在当前类之外访问或设置为实例成员超出了编译器的范围(并且无论如何都不可能进行反射)。

一个可能的解决方案是简单地避免带有初始化器样式的匿名子类并执行此操作:

private final static HashMap<String, Byte> STRING_MAP = new HashMap<String, Byte>();

static {
STRING_MAP.put("A", new Byte((byte)12));
STRING_MAP.put("B", new Byte((byte)13));
}

在大多数情况下,结果几乎相同,并且您的代码中没有充斥着匿名类。

关于java - @SuppressWarnings ("serial"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4749207/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com