2012-07-11 29 views

回答

3

Java tutorial

一個枚舉類型必須是包私人或私人的訪問構造函數。它會自動創建在枚舉主體開始處定義的常量。你不能自己調用​​一個枚舉構造函數。

能夠創建枚舉的新實例是沒有意義的,所以語言阻止你這麼做!

+0

不,他們喜歡接口,但特殊的接口 – 2012-07-11 14:59:20

+0

@MarkBakker:枚舉就像接口? – 2012-07-11 14:59:47

+0

Well Enums是靜態最終字符串的替代品。我的意思是它們就像接口,你不能啓動接口或枚舉。 – 2012-07-11 15:03:50

1

枚舉並不意味着被實例化(由你)。

http://docs.oracle.com/javase/tutorial/reflect/special/enumTrouble.html

提示:這是一個編譯時錯誤,試圖明確實例化一個枚舉,因爲這會阻止定義枚舉被獨特 常數。這個限制也在 反射代碼中執行。嘗試使用其默認構造函數實例化類的代碼應首先調用Class.isEnum()至 ,以確定該類是否爲枚舉。

+0

這絕對是要實例化。雖然不是來自枚舉的外部,而只是固定的次數。 – 2012-07-11 15:10:58

+0

@ JBNizet-你如何實例化枚舉,並確定了多少次? – nanosoft 2017-06-21 13:56:13

5

因爲根據定義,枚舉具有一組固定的實例,這些實例在枚舉本身中聲明和構造。因此,從枚舉類之外使用構造函數本身沒有任何意義。

而AFAIK,一個枚舉構造函數總是顯式或隱式地爲private。

0

你不能動態地擴展枚舉的原因是,實例化的值被編譯成字節碼的Class對象:

public T[] getEnumConstants() 
    Returns the elements of this enum class or null if this Class object does not 
    represent an enum type. 

因此,任何試圖建立一個新的實例不會能夠傳遞到實際的類,因爲Class對象不能被改變。如果你想要這種行爲,你必須自己模擬它,給它一些獨特的值來表示每一個值,然後有一個序數計數器,最後是一個靜態地圖(或其他結構)來保存所有的值。

public class MyEnum { 
    private static AtomicInteger nextOrdinal = new AtomicInteger(0); 
    private static Map<Integer, MyEnum> instances = 
     new HashMap<Integer, MyEnum>(); 

    private int ordinal; 
    private String name; 

    public MyEnum(String name) { 
    super(); 
    this.ordinal = nextOrdinal.incrementAndGet(); 
    this.name = name; 
    instances.put(Integer.valueOf(this.ordinal), this); 
    } 

    public String name() { 
    return name; 
    } 

    public int ordinal() { 
    return ordinal; 
    } 

    public static Set<MyEnum> getEnumConstants() { 
    return Collections.unmodifiableSet(instances.values()); 
    } 


    public static MyEnum fromInt(int ordinal) { 
    return instances.get(Integer.valueOf(ordinal)); 
    } 

    public static MyEnum fromString(String name) { 
    for (MyEnum val : instances.values()) { 
     if (val.name().equals(name)) { 
      return val; 
     } 
    } 
    return null; 
    } 

} 

你可能還需要一個.equals和.hashcode方法,以及防止同一個名字被多次使用(你可以做在構造函數,如果你拋出IllegalStateException什麼有一個重複的名字)。

相關問題