列挙型の抽象メソッドを呼び出します

アロン:

だから、私はそうのような列挙型を持っています、

public enum PlanProcessor { 
    A(1){
        @Override
        void processPlan(...){
            // logicA
        }

    }, 
    B(2){
        @Override
        void processPlan(...){
            // logicB
        }

    };

    abstract void processPlan(...);

    private int code;

    public static PlanProcessor valueOf(int code) {
        for (PlanProcessor type : values()) {
            if (type.code == code) {
                return type;
            }
        }
        throw new IllegalArgumentException("No enum const " + code);
    }
}

今、サービスクラスでは、

void execute(int classId) {
    PlanProcessor p = null;
    switch(PlanProcessor.valueOf(classId)){
    case A: {
                p = PlanProcessor.A;
                break;
            }
    case B: {
                p = PlanProcessor.B;
                break;
            }
    }

    p.processPlan(...);
}

今、すべてがここに正常に動作します。しかし、私は思っていた、スイッチを()を使用して、よりA、B、CのためのprocessPlan()呼び出すために良い方法はありますか?

DOは、あなたがしなければ私に知らせてください。ありがとうございました。

なスロー:

あなたのvalueOf(int)方法は、すでにのインスタンスを返しますPlanProcessorその後、各ケースが割り当て返さ定数に切り替えるp場合のために定義されている...同じ定数を。言い換えれば、あなたのswitch文は、完全に冗長です。これは、あなたが変数にswitch文のためのセレクタ式を抽出どうかを確認しやすくなることがあります。

void execute(int classId) {
  PlanProcessor p = null;

  PlanProcessor temp = PlanProcessor.valueOf(classId);
  switch (temp) {
    case A: // case for PlanProcessor.A
      p = PlanProcessor.A; // equivalent to "p = temp"
      break;
    case B: // case for PlanProcessor.B
      p = PlanProcessor.B; // equivalent to "p = temp"
      break;
  }

  p.processPlan(...);
}

上記のように簡略化することができます。

void execute(int classId) {
  PlanProcessor p = PlanProcessor.valueOf(classId);
  p.processPlan(...);
}

これは、あなただけの必要がある場合にPlanProcessor呼び出すには定数をprocessPlan、さらに簡単にすることができます。

void execute(int classId) {
  PlanProcessor.valueOf(classId).processPlan(...);
}

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=394083&siteId=1