2014-06-24 128 views
2

我有一個枚舉,其中每個枚舉映射到一個整數,與枚舉的ordinal()不匹配。現在我需要一種將整數轉換爲枚舉的方法。我認爲有兩個選擇:Java和枚舉的枚舉方法的命名int

  1. 具有獨特名稱的新方法,如(地道?):

    超載的valueOf()
    public static MyEnum fromInt(int i) {} 
    
  2. public static MyEnum valueOf(int i) {} 
    

是都可以,或者其中一個顯然不好或好?

提供這兩個是否好或壞?如果是的話,他們應該是相同的還是行爲細微差別的,例如,如果i不是有效值,則表現不同。

或者是否有第三個選項比這兩者都優越?

我正在尋找一個簡短的答案,告訴我們應如何做到符合已建立的Java編碼實踐。枚舉將被其他人使用並保持很長時間。請回答一些權威性的參考資料,或者強烈的經驗,而不是純粹的意見或感覺什麼更好。另外,這個問題不是關於如何實現這個方法,它只是關於它應該如何命名,以及如果名稱取決於確切的行爲,最符合「Java世界」的其餘部分。

+1

不要超載valueOf() - 它會混淆人類。工廠方法是要走的路。 – Bohemian

回答

4

意見第一:

我通常是基於它的目的,不只是的valueOf或任何東西的名字我的枚舉工廠方法。 例如考慮,假設:

public enum Language{ 
GERMAN(345), 
ENGLISH(342); 

private int isoCode; 

public static Language fromIsoCode(int isoCode){ 
    //do my logic here 
} 
} 

在這種情況下,我告訴我的媒體庫的用戶究竟應該傳遞給fromIsoCode的isocode,而不是有序或任何其他整數可能是枚舉的一部分。

所以建議,重新考慮命名fromInt或valueOf,並根據該整數在枚舉上下文中真正表示的名稱命名。

6

推測編號意味着東西 - 所以我會創建一個使用該信息的方法。例如:

public enum HttpStatus { 
    OK(200), 
    ... 
    NOT_FOUND(404); 

    private int statusCode; 

    private HttpStatus(int statusCode) { 
     this.statusCode = statusCode; 
    } 

    public static HttpStatus fromStatusCode(int statusCode) { 
     ... 
    } 
} 

只是fromInt不會產生預期的意味着整數的跡象...它也不允許替代int基於查找後。

+0

確定你輸入的快! – maress

+0

@maress,當然Jon Skeet鍵入的速度很快。這是Jon Skeet他自己! :) – AlexR

3

我個人不喜歡fromInt(),因爲它的名字沒有給讀者添加任何東西來理解這個方法做什麼。 valueOf()名稱不包含其他信息,但看起來更熟悉。

但是,如果您的int有一些名稱,例如id,我可能更喜歡方法fromId()