Java枚举被认为是原始类型还是引用类型?

zer*_*lus 52 java

如果我有一个枚举对象,它被认为是原语还是引用?

SLa*_*aks 57

这是一种参考类型.Java原语是boolean byte short char int long float double.

您可以通过调用获取枚举常量的值ordinal(),EnumSet和EnumMap使用它iterator并"以自然顺序遍历元素(枚举常量的声明顺序)"

您甚至可以将自己的成员添加到枚举类中,如下所示:

public enum Operation {
  PLUS   { double eval(double x, double y) { return x + y; } },
  MINUS  { double eval(double x, double y) { return x - y; } },
  TIMES  { double eval(double x, double y) { return x * y; } },
  DIVIDE { double eval(double x, double y) { return x / y; } };

  // Do arithmetic op represented by this constant
  abstract double eval(double x, double y);
}
//Elsewhere:
Operation op = Operation.PLUS;
double two = op.eval(1, 1);
Run Code Online (Sandbox Code Playgroud)

  • @SLaks:尽管如此,说"Java枚举是不可变对象实例"仍然是不准确的,因为你觉得它们应该*. (19认同)
  • `enum`实例实际上不一定是不可变的.枚举可以有可变变量. (11认同)

小智 12

枚举的工作方式实际上与它们在引入Java 5之前的使用方式并没有太大的不同:

public final class Suit {

public static final Suit CLUBS = new Suit();
public static final Suit DIAMONDS = new Suit();
public static final Suit HEARTS = new Suit();
public static final Suit SPADES = new Suit();

/**
 * Prevent external instantiation.
 */
private Suit() {
    // No implementation
}}
Run Code Online (Sandbox Code Playgroud)

通过在类加载上实例化不同的套装,确保它们是互斥的,私有构造函数确保不会创建更多的实例.

这些可以通过==或等于进行比较.

Java 5枚举的工作方式几乎相同,但有一些必要的功能来支持序列化等.

我希望这一背景能够进一步阐明.