2015-05-06 53 views
0

通過閱讀Enum Types, The Java Tutorials枚舉值() - 調用每個時間或分配給可變

編譯器自動當它創建 枚舉增加了一些特殊的方法。例如,它們具有一個靜態值方法,該方法返回一個 數組,該數組包含聲明爲 的枚舉的所有值。此方法通常與 結合使用,用於遍歷枚舉類型的值。

我想知道values()方法的確切功能。它實際上是僅僅返回一個類成員/常量,還是更隱藏在引擎之下?下面的代碼是在沒有爲了演示的最佳做法,但亮點方式這個問題將如何回答影響我可能會如何處理一個問題:如果values()返回類成員/恆定我認爲稱之爲慷慨

(見getAllValues()),像這樣:

enum ExampleEnum { 
    A("A's String"), B("B's String"), C("C's String"); 
    ExampleEnum(String someValue) { 
     this.someValue = someValue; 
    } 

    private final String someValue; 

    private String[] getAllValues() { 
     String[] result = new String[values().length]; 
     for (int i = 0; i < values().length; i++) { 
      result[i] = values()[i].someValue; 
     } 
     return result; 
    } 
} 

但如果它是做實際工作,我會改變getAllValues()如下:

private String[] getAllValues() { 
    ExampleEnum[] values = values(); 
    String[] result = new String[values.length]; 
    for (int i = 0; i < values.length; i++) { 
     result[i] = values[i].someValue; 
    } 
    return result; 
} 

回答

2

每次您撥打values()時,您都會創建一個填充了枚舉常量的新數組。你可以很容易與==操作

System.out.println(ExampleEnum.values()==ExampleEnum.values());//prints false 

所以第二個選項測試它會更好,因爲它創造了一次這個數組。但爲了改進它,您可以簡單地在此方法外存儲values()的結果,並在需要時重新使用它。這樣你只需調用一次。您也可以先創建someValue元素的集合,將其存儲爲不可修改的集合(如List)並將其返回。

所以,你的代碼可能是這樣的:

enum ExampleEnum { 
    A("A's String"), B("B's String"), C("C's String"); 
    ExampleEnum(String someValue) { 
     this.someValue = someValue; 
    } 

    private final String someValue; 

    private static final ExampleEnum[] vals = values(); 
    private static final List<String> names = Collections.unmodifiableList(
      Stream.of(vals).map(en -> en.someValue).collect(Collectors.toList())); 

    public static List<String> getAllValues() { 
     return names; 
    } 
}