Ich glaub, dass ich das Thema erstmal falsch verstanden habe @Marco13 wollte wissen, für was für Usecases wir enums einsetzen, und gar nicht nur unbedingt das Planetenbeispiel diskutieren. Spontan fallen mir 2 Sachen ein, wofür ich enums verwendet habe.
- Angenommen ich habe einen RESTEndpoint der eine Liste von Personen zurück gibt. Als Parameter kann ein Sortierkriterium angegeben werden. Die Menge der Sortierkriterien ist beschränkt, könnte sich aber mit der Zeit erweitern. Ich hab das so implementiert:
public enum PersonComparators implements Comparator<Person> {
FIRST_NAME(Comparator.comparing(Person::getFirstName)),
LAST_NAME(Comparator.comparing(Person::getLastName));
private final Comparator<Person> comp;
private PersonComparators(Comparator<Person> comp) {
this.comp = comp;
}
@Override
public int compare(Person o1, Person o2) {
return comp.compare(o1, o2);
}
}
und der Service dazu sieht ungefähr so aus:
public class PersonService {
public Stream<Person> getPersons(String orderBy) {
PersonComparators order = PersonComparators.valueOf(orderBy);
Stream<Person> persons; //=...
return persons.sorted(order);
}
}
- Beispiel war ein Parser. Das kongrete Beispiel wäre zu komplex für hier, aber angenommen, ich habe eine Lampe und einen Parser der Ausdrücke der Form “ON#OFF#ON#ON#OFF#ON#OFF” entgegen nimmt und dann auswerten kann, was der finale Zustand der Lampe ist.
Das könnte man so implementieren:
public enum LightState {
ON {
@Override
public LightState next(String state) {
if ("ON".equals(state)) {
return ON;
} else if ("OFF".equals(state)) {
return OFF;
} else {
return UNDEFINED;
}
}
},
OFF {
@Override
public LightState next(String state) {
if("ON".equals(state)) {
return OFF;
} else if("OFF".equals(state)) {
return OFF;
} else {
return this;
}
}
},
UNDEFINED {
@Override
public LightState next(String state) {
return UNDEFINED;
}
};
public abstract LightState next(String state);
}
Und der Parser sieht so aus:
public class LightParser {
public LightState getFinalState(LightState init, String expression) {
String[] parts = expression.split("#");
LightState result = init;
for (String part : parts) {
result = result.next(part);
}
return result;
}
}
Beide Fälle sind beliebig erweiterbar (OK bei der Lampe schwer vorstellbar, aber mein Usecase für den Parser war komplexer)