2013-09-26 15 views
9

Mam sytuację, która według mnie jest dość powszechna. Mam enum Java:Bezpieczne wyliczanie niestandardowych atrybutów w systemie Android

public enum Flavour { CHOCOLATE, STRAWBERRY } 

Mam atrybutu niestandardowego zdefiniowane w attrs.xml:

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

Ale to czuje się bardzo krucha. Opiera się na mnie ręcznie mapowanie z atrybutu do enum poprawnie.

Jeśli ktoś doda "SARDINE" na końcu Enum Flavour, to oczywiście nie zostanie automatycznie dodany do definicji atrybutu. To wystarczy.

Co gorsza, jeśli ktoś doda "SARDINE" w środku enum, przerwie układy XML, które używają "truskawki".

Jak ludzie to przezwyciężą? Zastanawiałem się, za pomocą ciąg (i przy użyciu Flavour.valueOf()), ale miałem nadzieję, że nie może być czystsze rozwiązanie tam.

Odpowiedz

-3

Tak długo, jak utrzymujesz wyliczanie Smaku na bieżąco i zsynchronizowane z atrybutem smaku, powinno być dobrze, ale jeśli naprawdę nie chcesz martwić się o zamówienie, nie używaj indeksów. Zamiast tego idź z ciągami znaków, tak jak rozważałeś.

public enum Flavor { 
    CHOCOLATE, STRAWBERRY 

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

Cóż, wspomniałem to podejście w moim pytaniu jako możliwe obejście, ale po pierwsze rezygnuje ze wszystkich zalet używania niestandardowego atrybutu. Z twoją implementacją, jeśli ktoś ustawi wartość "choclate", to w tajemniczy sposób zostanie ustawiony na TRUSSBERRY w czasie wykonywania. Inna implementacja może rzucić wyjątek na niezrównaną wartość, ale jest to sprawdzanie w czasie wykonywania, podczas gdy niestandardowe atrybuty umożliwiają sprawdzanie kompilacji. – Martin

Powiązane problemy