2015-06-25 82 views
-3

我有以下的代码,我试着去理解它做什么枚举构造函数接受的参数多于规定

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. 是什么实例(“无”)?
  2. ExampleClass只在构造函数中占用1个变量,为什么在静态块ITEM中需要3个?
+3

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

回答

2

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

public enum ExampleClass { 
    INSTANCE, 
    ITEM; 
} 

这就是说,你可以定义自己的构造函数,枚举,像这样的:

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

以同样的方式与课程,如果你定义一个自定义构造函数,JVM不会创建默认构造函数。

  • INSTANCE("nothing")将使用您的自定义构造函数实例化。
  • ITEM无效,因为没有'no-arg'构造函数。

这将是有效的:

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个参数的构造函数,所以它仍然不能编译

+0

OPs示例可能接近工作的唯一方法是如果构造函数有一个可变参数 – Buurman

+0

我没有写代码。这是生产中的代码,我试图理解它。我也不明白它的作品,但它似乎... ...无论如何 – user2628641

相关问题