【问题标题】:Why instance field of 'enum' is 'enum' in java?为什么'enum'的实例字段在java中是'enum'?
【发布时间】:2014-11-03 00:56:05
【问题描述】:

对于下面的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 的旧概念,它是一个常量的集合?是这个原因吗?

【问题讨论】:

  • 我不太明白你在说什么。您是否将 java 的枚举与 C 风格的一切可见类型进行比较(只需输入 EMPTY)?
  • 没有enum pre 5.0
  • @Pokechu22 是的,这是正确的
  • 基本上是类型安全,C 中的常量(只是整数)不提供。
  • 您在问“为什么枚举类的成员字段被设计为枚举的实例”,但在您的代码中,我看不到任何您试图演示的内容。

标签: java enums


【解决方案1】:

您所说的(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() {}
}

(枚举类和手工类还是有很大区别的,不过还不是你关心的问题)

【讨论】:

  • 所以,EMPTYenum 类的静态字段,允许使用引用变量Species 访问该静态成员
  • 我想我没有得到你的答案,你是说TypeAndSize.Species.EMPTY 可以传递给Species 类型的变量吗?
  • EMPTY,在您的示例中,是Species。确保你理解我写的内容:ABFoo 的最终静态成员,类型为Foo。如果它是Foo 类型,当然它可以用作Foo(例如作为Foo 类型的参数传递给方法)
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 我的意思是,TypeAndSize.Species.EMPTYTypeAndSize.Species.FISH 的类型为 Species。那是对的吗?我在查询中说enum class type,但不是enumenum class type 的名称是Species
  • 是的,Species.EMTPYSpecies.FISHSpecies 类型的值。你有一个类型 Species,它是一个枚举,“枚举类类型的名称是 Species”似乎是一种迂回的说法。
猜你喜欢
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多