2015-06-25 78 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

相關問題