8

我和一位同事讨论了 Java 如何表示枚举。我的印象是它们严格来说是像 C/C++ 这样的整数。或者,如果您添加行为(类型安全枚举),它会被包装在一个类中。他相信,如果它足够小,Java 会将其压缩为一个字节。

但是,我在 Oracle 网站上找到了这个:

Java 编程语言的枚举比其他语言中的枚举要强大得多,后者只不过是美化的整数。新的枚举声明定义了一个成熟的类(称为枚举类型)。

我认为它们是实际的对象。如果是这样,有没有办法优化它们以节省空间?

谢谢

编辑:正如对 Jon 的回答的评论中提到的那样,我在 Enum 的序列化大小之后。

4

1 回答 1

18

不,Java 枚举值确实是对象。它们可以具有字段、方法等 - 以及基于每个值的方法的不同实现。但是,它们只有一组固定的 - 这不像您自己创建枚举类型的实例;有效值集是在类型初始化时创建的。除非你有大量的枚举值,否则你几乎不需要考虑优化。

请注意,只要您在逻辑上考虑一组枚举值,就可以使用一种易于实现的优化。EnumSet这使用位模式基本上有效地表示集合。

(请注意,这里的 C# 比 Java 更接近 C++ - C# 枚举不幸地是非面向对象的。叹息。)

编辑:枚举值根据文档按名称序列化:

5.0 版中新增了对序列化处理枚举类型的支持。序列化枚举实例的规则与序列化“普通”可序列化对象的规则不同:枚举实例的序列化形式仅包含其枚举常量名称以及标识其基本枚举类型的信息。反序列化行为也不同——类信息用于查找适当的枚举类,并使用该类和接收到的常量名称调用 Enum.valueOf 方法,以获得要返回的枚举常量。

但是,如果您真的想要一个小的序列化形式,那么您可能应该避开 Java 的内置序列化,它相对冗长(并且对版本控制问题极为敏感)。有各种各样的选择——我最了解的一种是Protocol Buffers,它将枚举值序列化为整数。

于 2011-09-01T21:32:50.493 回答