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

62

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


1
枚举类型是一种普通的类,具有一些优化(用于序列化),构造函数检查继承级别以及额外的共享数组(非克隆())来声明枚举。公共方法values()总是返回一个新副本。它们可以实现接口等 :) - bestsss
4个回答

67

它是一个引用类型。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);

+1 我完全不知道这个功能。你能提供一个使用该操作的示例吗? - corsiKa
11
枚举实例并不一定需要是不可变的。枚举可以拥有可变的变量。 - sepp2k
19
尽管如此,仅仅因为你认为Java枚举应该是不可变的对象实例,并不能说“Java枚举是不可变的对象实例”是准确的。 - sepp2k
@Slaks 非常酷。这意味着您可以存储操作并简单地使用 getOperation().eval(getA(),getB()) 而无需使用 switch/case。我喜欢! :-) - corsiKa
@glowcoder 这基本上是使用枚举实现策略模式的一种方式。您也可以通过声明一个策略接口并从该接口派生类来实现具体策略。有关更多详细信息,请参见http://en.wikipedia.org/wiki/Strategy_pattern。 - helpermethod
1
也许更好的说法是,“Java枚举是不可变的对象引用。” - Jacob Tomaw

14

枚举的工作方式实际上与它们在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
}}

通过在类加载时实例化不同的套装,确保这些套装互斥,并且私有构造函数确保不会创建更多的实例。

这些内容可以通过 == 或 equals 进行比较。

Java 5 枚举基本上也是同样的方式,但具有一些必要的功能来支持序列化等。

我希望这些背景能够进一步说明问题。


0

本文基本上向您展示了枚举如何实现,正如SLaks所说,它们是引用。


-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接