Java 将枚举编译成什么?

2024-04-01

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

不过,我在 Oracle 网站上发现了这一点:

Java programming language enums are far more powerful than their counterparts in other languages, which are little more than glorified integers. The new enum declaration defines a full-fledged class (dubbed an enum type).

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

Thanks

编辑:正如对乔恩答案的评论中提到的,我在关注枚举的序列化大小。


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

请注意,其中的一点优化is容易实现的是使用EnumSet http://download.oracle.com/javase/7/docs/api/java/util/EnumSet.html每当您从逻辑上考虑一组枚举值时。这使用位模式来基本上有效地表示集合。

(请注意,这里 C# 比 Java 更接近 C++ - 遗憾的是 C# 枚举是非面向对象的。唉。)

编辑:枚举值被序列化name根据文档 http://download.oracle.com/javase/1,5.0/docs/guide/serialization/relnotes15.html:

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

如果您确实想要一个小的序列化形式,那么您可能应该避开 Java 的内置序列化,因为它相对冗长(并且对版本控制问题极其敏感)。有各种各样的选择 - 我最了解的是协议缓冲区 http://protobuf.googlecode.com, which does将枚举值序列化为整数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 将枚举编译成什么? 的相关文章

随机推荐