列挙型は、Javaで依存列挙型の上にいくつかの条件ロジックに基づいて設定さクラス変数への最善の方法は何ですか?

Hriamfrsdbhismil:

私はいくつかの計算または私はクラス変数の正しい列挙値を設定するために実行する必要があることを条件ロジックに基づいて、他の1つの列挙型の値をマップしようとしています。どのように私はあまりにも多くの場合/他、switch文を使用せずにこれを行うことができますか?

Enum BRAND {
 MINI, FERRARI, PAGANI
}

そして、別の列挙型

Enum ENGINE {
LEVEL1, LEVEL2, LEVEL3
}

そして、私のようなクラスを持っています:

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 ...;
 }
} 

そこ必要が値を設定するためにチェックすることを、複数のそのような状態であることと、私は上記のように厄介な場合/他/ switch文を避けたいことができます。これを行うための、より機能的な方法があります。

ラルフ・レンツ:

私はこのようになります言ったように述語を使用します:

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;
    }
}

あなたは、リストを通過し、正しい結果を見つけるための述語と結果と利用ストリーム、フィルタおよびFindFirstの持つリストを作成します。条件が単純である場合は、述語とテストを必要としないよりも、それは少し異なるビット。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=184695&siteId=1