简单的枚举类型是否与整数常量一样有效?

时间:2013-08-05 19:25:32

标签: java

当您使用enum类型时,您可以为每个常量添加参数,为每个常量提供一个主体,并为该类型提供一个主体。但如果你不做其中任何一件事:

enum enumType { C1, C2, C3 };

使用enum类型是否有效,因为它只是声明整数常量?

static final int C1 = 1;
static final int C2 = 2;
static final int C3 = 3;  // or whatever

或者由于此功能(提供物体的能力)仍有一些开销,即使在这种情况下不使用该功能?

4 个答案:

答案 0 :(得分:7)

您未指定应在其中比较性能的任何类型的上下文。在大多数情况下,enum成员是对象的事实完全无关紧要,因为只比较了参考值;对象本身甚至没有触及。

然而public static final int编译时常量,它们的值在使用地点被硬编码,这显然没有任何开销。< / p>

所以它几乎没有任何开销的开销,但是以编译时常量的问题为代价,这样改变它们中的任何一个都需要重新编译引用它的所有内容。

答案 1 :(得分:2)

是的,使用enum非常有效。您甚至可以使用==比较枚举的两个实例,并具有类型安全性的附加好处:

Fruits.APPLES == Fruits.ORANGES

如果查看Enum课程,您会看到equals()方法使用==来比较两个实例。创建枚举实例的所有繁重工作都是在类编译时完成的,因此没有额外的开销。

答案 2 :(得分:1)

与使用static final int常量实现相关功能相比,枚举常量不会带来明显的性能损失。在内部,枚举常量简单地表示为32位整数。但是,在JVM的上下文中,枚举常量提供了类型安全性,可扩展性以及比使用int常量更大的灵活性。

使用枚举常量而不是int常量的唯一缺点是加载和初始化枚举类对象的时间,但是在任何真实场景中这都不太可能明显。在您提出问题的示例中,一旦应用程序加载并运行,使用枚举超过int常量就不会有性能损失。还要注意,因为枚举常量必然是单例(由JVM保证),所以它们可以与'=='运算符有效地进行比较,以获得相等和同一性,就像对大多数原始值一样。

Joshua Bloch在Effective Java,2nd Ed中对枚举类型进行了精彩的讨论。并提出令人信服的论据,为什么枚举常量应始终用于表示编译时已知的任何固定(或甚至大多数固定)常量。

答案 3 :(得分:0)

它完全取决于它们的使用环境。好像你有一些相关的常量然后你应该使用枚举,如果没有,那么你应该使用常量。因为将不相关的常数聚集在一起是不合逻辑和错误的方式。

两者都是内联常量,即它们的每次出现都被替换为相应的值,所以每当你对它们进行更改时,你应该再次编译所有文件,这些文件在它们的代码中使用它们。否则你会得到不正确的结果。

如果你有相关的常量,那么使用枚举将是一个明智的选择。如,

  1. 他们被序列化。
  2. 提供API支持,以便您可以有效地使用它们而不会产生太多开销。