Ho un'interfaccia vuota Units
che sto usando per etichettare diversi enums
quindi so che contengono unità diverse (ad es. Ho uno enum TemperatureUnits implements Units{}
che memorizza Fahrenheit, Celsius, ecc, quindi ho un DistanceUnits
che tiene metri, piedi, eccGestione di valori di enum da enumerazioni diverse che implementano una determinata interfaccia in uno switch/caso
voglio fare cose diverse in uno switch/caso sulla base del quale enum
valore viene passato a un metodo. voglio che accettare un valore da qualsiasi enum
che implementa Units
.Il problema è che, dal momento che le classi enums
sono in realtà diverse, devo utilizzare il nome qualificato del valore nello switch/ca SE. Il mio codice simile a questa:
public static void foo(Units units){ //units has to be an enum that implements Units
switch (units){
case TemperatureUnits.FAHRENHEIT: //I can't say just FAHRENHEIT, because Units itself doesn't
//have a FAHRENHEIT value, but it won't let me say TemperatureUnits.FAHRENHEIT because it won't let use
// qualified enum values as cases.
//Do stuff
break;
case DistanceUnits.METERS:
//Do other stuff
break;
//...etc
Come avrei un'istruzione switch/caso che può utilizzare valori diversi da enums
?
Edit: La mia interfaccia Units
è solo:
public interface Units{
String getLabel();
}
utilizzare il polimorfismo al posto di un caso interruttore gigante, che sarebbe diventato non corretta al più presto una nuova costante enum o enum classe è definita. Aggiungi un metodo in Unità, sovrascrivilo in tutte le enumerazioni e chiamalo invece di eseguire il blocco switch. ad esempio, usa unit.foo() invece di foo (unità). L'interfaccia deve essere denominata "Unità", BTW: CELSIUS_DEGREE è un'unità, non un'unità. –
Sembra una situazione in cui stai definendo una * classe tag *, cioè il comportamento della classe cambia in modo significativo a seconda del valore di qualche tag (Temperatura, Distanza, ecc.) In questo caso, il tuo migliore, il più elegante e la soluzione più solida (come menzionato da JB) è sviluppare una gerarchia di classi (ad esempio TemperatureUnits è una sottoclasse di Unità). Altrimenti, il tuo codice può sembrare molto brutto se provi a fare tutto con una grande classe (o enum). Il comportamento specifico desiderato può essere facilmente definito dalle sottoclassi. – scottb
Perché vuoi avere un enum base per cose totalmente indipendenti come la temperatura, la distanza e così via? – Robert