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

Java 简单枚举类型是否与整数常量一样有效?,java,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 或者,即使在本例中未使用该功能,该功能(提供实体的能力)是否仍会带来一些开销 是的,使用enums非常有效

使用
enum
类型时,可以为每个常量添加参数,为每个常量提供正文,并为类型提供正文。但如果你不这样做:

enum enumType { C1, C2, C3 };
使用
enum
类型是否与仅声明整数常量一样有效

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

或者,即使在本例中未使用该功能,该功能(提供实体的能力)是否仍会带来一些开销

是的,使用
enum
s非常有效。您甚至可以使用
=
来比较枚举的两个实例,这还具有类型安全的额外好处:

Fruits.APPLES == Fruits.ORANGES

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

是的,使用
enum
s非常有效。您甚至可以使用
=
来比较枚举的两个实例,这还具有类型安全的额外好处:

Fruits.APPLES == Fruits.ORANGES

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

您没有指定任何类型的上下文来比较性能。在大多数情况下,
enum
成员是对象这一事实是完全不相关的,因为只比较参考值;这些物体本身甚至不被触摸

然而,
publicstaticfinalint
是编译时常量,它们的值在使用位置进行了硬编码,这显然不会带来任何开销


因此,与完全没有开销相比,它的开销非常小,但代价是编译时常量出现问题,因此更改任何常量都需要重新编译引用它的所有内容。

您没有指定任何类型的上下文来比较性能。在大多数情况下,
enum
成员是对象这一事实是完全不相关的,因为只比较参考值;这些物体本身甚至不被触摸

然而,
publicstaticfinalint
是编译时常量,它们的值在使用位置进行了硬编码,这显然不会带来任何开销


因此,与完全没有开销相比,它的开销非常小,但代价是编译时常量出现问题,因此更改任何一个常量都需要重新编译引用它的所有内容。

这完全取决于使用它们的上下文。如果您有一些相关的常量,那么您应该使用枚举,如果没有,那么您应该使用常量。因为把不相关的常数拼凑在一起是不合逻辑的错误方式

这两个都是内联常量,也就是说,它们的每次出现都会被相应的值替换,因此每当您对它们进行更改时,都应该再次编译所有文件,这些文件在代码中使用了它们。否则,您将得到错误的结果

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

  • 它们是序列化的
  • 提供了API支持,因此您可以高效地使用它们,而无需太多开销

  • 这完全取决于它们的使用环境。如果您有一些相关的常量,那么您应该使用枚举,如果没有,那么您应该使用常量。因为把不相关的常数拼凑在一起是不合逻辑的错误方式

    这两个都是内联常量,也就是说,它们的每次出现都会被相应的值替换,因此每当您对它们进行更改时,都应该再次编译所有文件,这些文件在代码中使用了它们。否则,您将得到错误的结果

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

  • 它们是序列化的
  • 提供了API支持,因此您可以高效地使用它们,而无需太多开销

  • 与使用
    static final int
    常量实现相关功能相比,枚举常量没有明显的性能损失。在内部,枚举常量仅表示为32位整数。然而,在JVM的上下文中,枚举常量提供了类型安全性、可扩展性和比使用int常量更大的灵活性

    在int常量上使用enum常量的唯一缺点是加载和初始化enum类对象的时间,但是这在任何实际场景中都不太可能出现。在您在问题中给出的示例中,一旦应用程序加载并运行,在int常量上使用enum不会导致性能损失。还请注意,因为枚举常量必须是单例(由JVM保证),所以它们可以与“==”操作符进行有效的相等和标识比较,就像您对大多数基本值所做的那样


    Joshua Bloch在《有效Java》第二版中对枚举类型进行了出色的讨论,并提出了令人信服的论据,说明为什么枚举常量应始终用于表示任何固定的(甚至大部分固定的)编译时已知的一组常量。

    与使用
    静态最终int
    常量实现相关功能相比,枚举常量没有明显的性能损失。在内部,枚举常量仅表示为32位整数。然而,在JVM的上下文中,枚举常量提供了类型安全性、可扩展性和比使用int常量更大的灵活性

    在int常量上使用enum常量的唯一缺点是加载和初始化enum类对象的时间,但是这不太可能