0

所以,我有一个像这样的枚举,

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

现在,这里一切正常。但我想知道,有没有比使用 switch() 为 A、B、C 调用 processPlan() 更好的方法?

如果你这样做,请告诉我。谢谢。

4

1 回答 1

0

您的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(...);
}
于 2020-04-01T18:05:38.113 回答