2013-08-25 41 views
3

此前而是採用枚舉,我會做這樣的事情:枚舉單例函數是如何實現的?

public static ExampleClass instance; 

public ExampleClass(){ 
    instance=this; 
} 

public static ExampleClass getInstance(){ 
    return instance; 
} 

這時,有人告訴我一個枚舉單:

public enum Example{ 
INSTANCE; 

public static Example getInstance(){ 
     return Example.INSTANCE; 
} 

在第一個例子,我不得不實例化對象,以創建實例。有了枚舉,我不需要那樣做......至少看起來是這樣。有人能解釋這背後的原因嗎?

回答

5

如果拆卸枚舉/課後編譯與 -

javap的實例

您GET-

Compiled from "Example.java" 
public final class Example extends java.lang.Enum<Example> { 
    public static final Example INSTANCE; 
    public static Example[] values(); 
    public static Example valueOf(java.lang.String); 
    public static Example getInstance(); 
    static {}; 
} 

正如你所見INSTANCE是一個公共靜態最終字段示例類。

如果拆卸您EmployeeClass,你GET-

public class ExampleClass { 
    public static ExampleClass instance; 
    public ExampleClass(); 
    public static ExampleClass getInstance(); 
} 

你看到現在的區別是什麼?它與基本的差異基本相同。

1

我建議閱讀Joshua Bloch的Item 3: Enforce the singleton property with a private constructor or an enum type from Effective Java,它解釋了它是如何工作的以及爲什麼要將enum用作Singleton。