Java枚举可以有多个构造函数吗?

11

我知道我可以像这样创建枚举:

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

但我有一些问题:

1)看起来枚举值是在开头声明的。是否有特定的格式?我能否在其他位置声明它们?

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


你想分享一下你打算如何使用它吗? - Ruan Mendes
1
我想知道为什么你不先尝试第二个选项呢? - Hovercraft Full Of Eels
你甚至可以重载构造函数 - falsarella
3个回答

15
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. 请查看上面的代码。这是可能的。人们是否这样做取决于应用程序。如果你有很多字段,其中大多数应该是默认值,那么使用多个构造函数是一个好方法。此外,字段的值可以在运行时读取(从文件或另一个静态类)。

8
  1. 是的,它们必须在枚举类的其他字段之前声明。
  2. 是的,它们可以有多个构造函数。

您可以通过自己尝试来发现这一点。


1
我知道,这可能需要多长时间呢?但是,现在它已经存在了,供其他人搜索使用。我更感兴趣的是,在哪些情况下它会有用。 - Ruan Mendes
枚举是一个类。如果你理解了为什么一个类可能需要多个构造函数,那么你也会理解为什么枚举也可能需要:出于同样的原因。 - JB Nizet
枚举是一种特殊类型的类。仅仅展示一个例子比暗示我不理解构造函数重载更有用。从你的评论中,我猜测这个例子会默认一些字段,这是我知道构造函数重载最常见的用法... - Ruan Mendes
其他答案中已经有了一些例子。我相信你已经理解了构造函数的重载。我不确定的是你是否知道枚举是类。它们并没有那么特殊。它们不能继承另一个类,并且它们有一组固定的实例。除此之外,它们和其他所有类一样。 - JB Nizet
我曾经在Java 1.5之前使用过类型安全的枚举模式,但我从未创建过具有多个构造函数的枚举,我只是好奇它在现实世界中的用途是什么。 - Ruan Mendes
就像其他类一样,有些枚举实例可能需要一个带有单个字符串参数的构造函数,而另一些则可能需要一个带有int、float和double的构造函数。 - JB Nizet

4
  1. 根据JLS 7 ,常量排在前面。

  2. "任何枚举声明中的构造函数或成员声明,如果没有明确声明除外,都与普通类声明的类体中的存在方式完全相同。" 和 "如果一个枚举类型的构造函数声明为public或protected,那么这是一个编译时错误。" (同上,8.9.2)


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