2013-09-26 4 views
9

Ho una situazione che presumo sia piuttosto comune. Ho un enum Java:Attributi personalizzati enum sicuri in Android

public enum Flavour { CHOCOLATE, STRAWBERRY } 

Ho un attributo personalizzato definito in attrs.xml:

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

Ma questo si sente veramente fragile. Si basa su di me la mappatura manuale dall'attributo all'enum correttamente.

Se qualcuno aggiunge "SARDINE" alla fine di enum Flavor, ovviamente non verrà aggiunto automaticamente alla definizione dell'attributo. Questo è abbastanza giusto.

Ma peggio, se qualcuno aggiunge "SARDINE" nel mezzo dell'enumerazione, interromperà i layout xml che usano "fragola".

Come le persone superano questo? Ho preso in considerazione l'utilizzo di string (e utilizzando Flavour.valueOf()), ma speravo che potesse esserci una soluzione più pulita.

risposta

-3

Finché mantieni l'enumerazione di Flavor aggiornata e in sincronia con l'attributo flavor, dovrebbe andare bene, ma se davvero non vuoi preoccuparti dell'ordine, non usare indici. Invece vai con le stringhe come hai considerato.

public enum Flavor { 
    CHOCOLATE, STRAWBERRY 

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

Ebbene sì, ho menzionato tale approccio nella mia domanda come possibile soluzione, ma rinuncia a tutti i vantaggi dell'uso di un attributo personalizzato in primo luogo. Con la tua implementazione, se qualcuno imposta il valore su "choclate", verrà misteriosamente impostato su STRAWBERRY in fase di runtime. Un'altra implementazione potrebbe generare un'eccezione su un valore non corrispondente, ma si tratta di un controllo di runtime mentre gli attributi personalizzati forniscono un controllo in fase di compilazione. – Martin