Estoy tratando de asignar los valores de una enumeración a la otra basada en algunos cálculos o lógica condicional que tengo que llevar a cabo para establecer el valor de enumeración correcto para la variable de clase. ¿Cómo puedo hacer esto sin usar demasiadas sentencias switch, if / else?
Enum BRAND {
MINI, FERRARI, PAGANI
}
y otra enumeración
Enum ENGINE {
LEVEL1, LEVEL2, LEVEL3
}
Y tengo una clase como:
Class Car() {
int model;
int year;
Engine engine;
// I want to calculate set the engine depending on the brand based on conditional logic
public carEngineCalculator (Brand b) {
Car mycar = new Car();
if (mycar.isSuperCar(b) {
if (mycar.isCrazyGood(b)) {
mycar.engine = ENGINE.LEVEL1;
} else {
mycar.engine = ENGINE.LEVEL2;
}
} else {
mycar.engine = ENGINE.LEVEL3;
}
... //And the conditions can be more complex
}
public boolean isSuperCar(Brand b) {
if (b.FERRARI || b.PAGANI) {
return true;
}
return false;
}
public boolean isCrazyGood(Brand b) {
return ...;
}
}
No puede haber más de uno de tales condiciones que necesitan ser revisados con el fin de establecer los valores y quiero evitar sentencias switch / desagradable si / else como se muestra arriba. ¿Hay una manera más funcional de hacer esto.
El uso de predicados como dije se vería así:
public enum Brand {
MINI,
FERRARI,
PAGANI
}
public enum Engine {
LEVEL1,
LEVEL2,
LEVEL3
}
public class Entry {
public final Predicate<Car> pred;
public final Engine engine;
public Entry(Predicate<Car> pred, Engine engine) {
this.pred = pred;
this.engine = engine;
}
}
public class Car {
int model;
int year;
Engine engine;
public void carEngineCalculator(Brand b) {
Car mycar = new Car();
List<Entry> cases = new ArrayList<>();
cases.add(new Entry(c -> c.isSuperCar(b) && c.isCrazyGood(b), Engine.LEVEL1));
cases.add(new Entry(c -> c.isSuperCar(b) && !c.isCrazyGood(b), Engine.LEVEL2));
cases.add(new Entry(c -> !c.isSuperCar(b), Engine.LEVEL3));
mycar.engine = cases.stream().filter(x -> x.pred.test(mycar)).findFirst().get().engine;
}
public boolean isSuperCar(Brand b) {
if ((b == Brand.FERRARI) || (b == Brand.PAGANI)) {
return true;
}
return false;
}
public boolean isCrazyGood(Brand b) {
return false;
}
}
Se crea una lista con los predicados y Resultados y corriente de partida, filtro y findFirst que pasar por la lista y encontrar el resultado correcto. Si las condiciones son más simples que usted no necesita predicados y prueba un poco diferente de bits.