2013-09-26 47 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