¿Cuál es la mejor manera de conjunto variable de clase, que se basa en una enumeración de algunas condiciones lógicas en una enumeración depende en Java?

Hriamfrsdbhismil:

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.

Ralf Renz:

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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=184698&siteId=1
Recomendado
Clasificación