2013-09-26 51 views
9

我有一種我認爲很常見的情況。我有一個Java枚舉:Android中的安全枚舉自定義屬性

public enum Flavour { CHOCOLATE, STRAWBERRY } 

我在attrs.xml定義自定義屬性:

<attr name="flavour"> 
    <enum name="chocolate" value="0" /> 
    <enum name="strawberry" value="1" /> 
</attr> 

但這種感覺真的很脆弱。它依靠我手動從屬性映射到枚舉正確。

如果有人在「enum Flavor」的末尾添加了「SARDINE」,那麼它顯然不會自動添加到屬性定義中。這很公平。

但更糟糕的是,如果有人在枚舉中添加了「SARDINE」,它將打破使用「草莓」的xml佈局。

人們如何克服這一點?我考慮過使用字符串(並使用Flavour.valueOf()),但我希望可能有一個更清潔的解決方案。

回答

-3

只要你保持Flavor enum與flavor屬性保持同步,它應該沒問題,但是如果你真的不想擔心順序,那就不要使用indices。按照你的想法去用字符串。

public enum Flavor { 
    CHOCOLATE, STRAWBERRY 

    public static Flavor get(String s) { 
    s = s.toLowerCase(); 
    if(s.equals("chocolate")) { 
     return CHOCOLATE; 
    } else { 
     return STRAWBERRY; 
    } 
    } 
} 
+0

嗯是的,我在我的問題中提到過這種方法作爲可能的解決方法,但它放棄了首先使用自定義屬性的所有優點。 隨着你的實現,如果有人將值設置爲「choclate」,那麼它將在運行時神祕地設置爲STRAWBERRY。 另一個實現可能會針對不匹配的值拋出異常,但這是運行時檢查,而自定義屬性會爲您提供編譯時檢查。 – Martin