【问题标题】:Enum constructor takes in more parameters than specified枚举构造函数接受的参数比指定的多
【发布时间】:2015-06-25 13:29:20
【问题描述】:

我有以下代码,我试图理解它的作用

public enum ExampleClass {
    INSTANCE("nothing"),
    ITEM;

    private String description;

    private ExampleClass(String description) {
         this.description = description;
    }

    static{
         ITEM = new ExampleClass("ITEM", 1, "this is an item");
    }
}

我的问题是:

  1. 什么是 INSTANCE("nothing")?
  2. ExampleClass在构造函数中只取1个变量,为什么在静态块ITEM里面取3个?

【问题讨论】:

  • 这不会编译(这意味着您的第二点没有任何意义,因为我们无法重新分配枚举常量)

标签: java enums


【解决方案1】:

ExampleClass 是一个enumINSTANCEITEMExampleClass 的 2 个实例(称为 enum constants)。例如,这将是有效的:

public enum ExampleClass {
  INSTANCE,
  ITEM;
}

也就是说,您可以为枚举定义自己的构造函数,例如:

private ExampleClass(String description) {
     this.description = description;
}

和类一样,如果定义了自定义构造函数,JVM不会创建默认构造函数。

  • INSTANCE("nothing") 将使用您的自定义构造函数进行实例化。
  • ITEM 无效,因为没有“无参数”构造函数。

这将是有效的:

public enum ExampleClass {
  INSTANCE("nothing"),
  ITEM;

  private String description;

  //Will be used to instantiate INSTANCE("nothing")
  private ExampleClass(String description) {
     this.description = description;
  }

  //Will be used to instantiate ITEM
  private ExampleClass() {
  }
}

new ExampleClass("ITEM", 1, "this is an item"); 更糟糕:你不能用new 实例化一个枚举。每个枚举文字只能存在一个实例,它们由 JVM 本身处理。即使有可能,也没有具有 3 个参数的构造函数,因此它仍然无法编译

【讨论】:

  • OPs 示例可以接近工作的唯一方法是构造函数具有可变参数
  • 代码不是我写的。这是生产中的代码,我试图理解它。我也不明白它的工作原理,但似乎它确实......无论如何谢谢
猜你喜欢
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 2014-07-30
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2020-10-28
相关资源
最近更新 更多