为什么'enum'的实例字段在java中是'enum'?

时间:2014-11-03 00:56:05

标签: java enums

对于以下TypeAndSize班级,

class TypeAndSize {

  Species type;               // runType EMPTY, SHARK, or FISH
  int size;                   // Number of cells in the run for that runType.

  enum Species{EMPTY,SHARK,FISH}

  /**
   *  Constructor for a TypeAndSize of specified species and run length.
   *  @param species is Ocean.EMPTY, Ocean.SHARK, or Ocean.FISH.
   *  @param runLength is the number of identical cells in this run.
   *  @return the newly constructed Critter.
   */

  TypeAndSize(Species species, int runLength) {
    if (species == null)    {   
      System.out.println("TypeAndSize Error:  Illegal species.");
      System.exit(1);
    }
    if (runLength < 1) {
      System.out.println("TypeAndSize Error:  runLength must be at least 1.");
      System.exit(1);
    }
    this.type = species;
    this.size = runLength;
  }

}

在下面的代码中使用enum类类型的成员字段,

class RunLengthEncoding {
    ...
    public RunLengthEncoding(int i, int j, int starveTime) {
          this.list = new DList2();
          this.list.insertFront(TypeAndSize.Species.EMPTY, i*j);
          ....
      }
    ...
}

让我问这个问题。

我的问题: 为什么enum类的成员字段被设计为enum的实例?因为传递enum类类型的参数很容易,它可以向后兼容C语言中enum的旧概念,它是常量的集合?那是什么原因吗?

2 个答案:

答案 0 :(得分:2)

您所谈论的内容(TypeAndSize.Species.EMPTY)不是Spicies的成员字段。当我们谈论“成员字段”时,它通常意味着实例变量(在Java中也可以用enum编写)。

在您要问的方面,您可以简单地将enum解释为使用类常量编写特殊类的特殊简写:

enum Foo {
  A,
  B;
}

类似于

class Foo {
    public static final Foo A = new Foo();
    public static final Foo B = new Foo();

    private Foo() {}
}

(枚举和手工制作课程之间仍有很多区别,但它们还不是你的关注点)

答案 1 :(得分:1)

  

使用枚举类类型的成员字段

TypeAndSize.Species.EMPTY未使用成员字段。它访问TypeAndSize中定义的枚举类型。

Species type正在定义一个成员字段,但它的类型不是枚举,它的类型是Species。

Enum与类和接口处于同一级别。这些是我们可以使用的构建块类型。我们想要在整数常量上使用枚举的原因可以是elsewhere

希望链接链接有助于回答问题的第二部分 我已尽力清理问题中使用的术语。