2012-11-13 58 views
2

在我的遺留代碼中,我有一個屬性/值對的概念。Java - 使用枚舉將字符串映射到接口的實現?

每個屬性/值在我的系統中都有一些任意的含義。所以,我的界面有方法getValue()和setValue()。其中每個都根據屬性在我的系統中的含義做了一些特定的業務邏輯。

這工作得很好,但我遇到了一些問題。

首先是我的映射往往是這個樣子:

if (name == "name1") return thisAttributeImplementation(); 

這是醜陋且容易搞砸了打字...

第二個問題是這些AttributeImplementations需要知道名字的屬性,但除非我將它作爲靜態成員提供,否則它們不會傳遞給構造函數,這兩者都很難看。

看起來好像枚舉是解決這兩個問題的好辦法,但是我在處理物流方面遇到了一些麻煩。爲了將字符串與對象相關聯,枚舉應該是什麼樣的?我應該如何遍歷枚舉來找到合適的呢?對象本身應該如何獲得與它們相關聯的字符串的知識?

+0

'在我的遺留代碼中...每個屬性/值在我的系統中都有一些任意含義 - 是否意味着未來不可能改變? (例如添加新屬性,改變現有屬性的含義) –

+0

@KevinK含義不會改變,因爲我們很快就會擺脫它們。 – Jeremy

回答

2

類似這樣的工作正確嗎?

public enum Borough { 
    MANHATTAN(1), 
    THE_BRONX(2), 
    BROOKLYN(3), 
    QUEENS(4), 
    STATEN_ISLAND(5); 

    private int code; 

    private Borough(final int aCode) { 
     code = aCode; 
    } 

    /** 
    * Returns the borough associated with the code, or else null if the code is not that of a valid borough, e.g., 0. 
    * 
    * @param aCode 
    * @return 
    */ 
    public static Borough findByCode(final int aCode) { 
     for (final Borough borough : values()) { 
      if (borough.code == aCode) { 
       return borough; 
      } 
     } 
     return null; 
    } 

    /** 
    * Returns the borough associated with the string, or else null if the string is not that of a valid borough, e.g., "Westchester". 
    * 
    * @param sBorough 
    * @return 
    */ 
    public static Borough findByName(final String sBorough) { 

     for (final Borough borough : values()) { 
      if (borough.name().equals(sBorough)) { 
       return borough; 
      } 
     } 
     return null; 
    } 

    public int fromEnumToInt() { 
     return mId; 
} 


} 
+3

這個findByName方法已經等價於(自動生成的)'Borough.valueOf(String)'方法。 –

+0

@LouisWasserman權利,但它更友好的形式,我想 –

+0

正確。足夠公平 – smk