Java FindBugs不抱怨枚举中的非序列化字段

Java FindBugs不抱怨枚举中的非序列化字段,java,serialization,enums,findbugs,Java,Serialization,Enums,Findbugs,如果我有课: class NonSerializable { } class CanSerialize implements Serializable { private static final long serialVersionUID = 0L; public NonSerializable nonSerializable; } FindBugs引发冲突 <BugInstance rank="14" category="BAD_PRACTICE" priority

如果我有课:

class NonSerializable {
}

class CanSerialize implements Serializable {
    private static final long serialVersionUID = 0L;
    public NonSerializable nonSerializable;
}
FindBugs引发冲突

<BugInstance rank="14" category="BAD_PRACTICE" priority="1" abbrev="Se" type="SE_BAD_FIELD">

FindBugs不再抱怨了。FindBugs中有bug吗?或者在枚举中有非瞬时的、非序列化的字段是安全的?

一方面,您的问题的答案是在枚举中有非瞬时的、非序列化的字段是安全的。另一方面,当枚举序列化时,它们不会被序列化。所以,即使它们不是瞬态的,它们也能像瞬态场一样工作

根据Java对象序列化规范:

1.12枚举常量的序列化 枚举常量的序列化方式不同于普通的可序列化或可外部化对象。这个 枚举常量的序列化形式仅由其名称组成;领域 该常数的值不在表中。序列化 枚举常量,ObjectOutputStream写入 枚举常量的名称方法。要反序列化枚举常量, ObjectInputStream从流中读取常量名称;这个 然后通过调用 java.lang.Enum.valueOf方法,传递常量的枚举类型 将收到的常量名称作为参数。像其他可序列化的 或者外部化对象,枚举常量可以用作目标 后续出现在序列化流中的反向引用

()

因此,
不可串行化
是否可串行化实际上并没有什么区别。因此,FindBugs不在枚举中标记这一点是正确的

如果我可以猜测的话,枚举中的字段通常是有效的最终字段,在类加载器加载枚举时进行初始化,因此可能他们认为序列化它们没有意义,下次类加载器加载枚举时也可以再次初始化它们。这不是我所知道的


编辑:感谢@TJR的链接,以下SpotBugs问题是相关的(以及您的问题的链接):。SpotBugs是FindBugs的继承者,建立在FindBugs代码基础上,并进一步开发。

仅供参考;为什么需要
Serializable
?@fge我不需要,但是Java中的每个枚举在默认情况下都是可序列化的
Serializable
,据我所知,当枚举为。如果我理解正确的话,
不可序列化
就不需要序列化。@OleV.V。你是对的!考虑把它作为答案。令人恼火的是findbugs实际上标记了这些。。。即使不这样做是正确的。至少在某些版本中是这样。
class NonSerializable {
}

enum CanSerialize {
    INSTANCE;
    public NonSerializable nonSerializable;
}