java enum可以有多个构造函数吗?

时间:2012-06-14 16:26:34

标签: java

我知道我可以创建一个这样的枚举:

public enum MyEnum {
   ONE(1),
   TWO(2);
   private int value;
   private MyEnum(int value) {
      this.value = value);
   }
   public int getValue() {
      return value;
   }
}

但我有一些问题:

1)似乎枚举值是在开始时声明的。有没有特定的格式。我可以在任何地方申报吗?

2)是否可以声明具有多个构造函数的枚举,这是人们有时会做的事情吗?

3 个答案:

答案 0 :(得分:8)

  1. 是的,它们必须在枚举类的其他字段之前声明。
  2. 是的,他们可以拥有多个构造函数。
  3. 你可以通过自己尝试来发现。

答案 1 :(得分:8)

public enum MyEnum {
   ONE(1),
   TWO(1, 2);
   private int value1, value2;

   private MyEnum(int value) {
      this.value1 = value;
      this.value2 = 0; // default
      // this.value2 = getFromSomewhereElse(); // get it at runtime
   }

   private MyEnum(int value1, int value2) {
      this.value1 = value1;
      this.value2 = value2;
   }

   public int getValue1() {
      return this.value1;
   }

   public int getValue2() {
      return this.value2;
   }
}
  1. 是的,您必须在开始时声明枚举值。总是。
  2. 请参阅上面的代码。有可能的。如果人们这样做取决于应用程序。如果你有很多字段,并且大多数字段应该是默认值,那么使用多个构造函数是一件好事。此外,可以在运行时(从文件或其他静态类)读取字段的值。

答案 2 :(得分:4)

  1. 根据JLS 7,常数先行。

  2. "枚举声明中的任何构造函数或成员声明都应用于枚举类型,就像它们已存在于普通类声明的类主体中一样,除非另有明确说明。"和"如果枚举类型的构造函数声明是公共的或受保护的,则是编译时错误。" (同上,8.9.2)