在switch语句中重用代码(Java)

时间:2013-12-21 20:18:56

标签: java switch-statement

我想使用switch语句,但如果没有重复代码或使用附带的if语句,我无法构建它。有办法解决这个问题吗?

我有5个案例,除了其中一个以外,我想执行某个操作。因此,使用switch语句,我可以这样做:

switch(x) {
case A:
    foo();
    break;
case B:
case C:
case D:
case E:
    bar();
    break;
}

易。但困难在于我还需要为每个动作执行另一个不同的动作,所以我不能使用案例的跌倒特征。所以我沦为

switch(x) {
case A:
    foo();
    baz(0);
    break;
case B:
    bar();
    baz(1);
    break;
case C:
    bar();
    baz(2);
    break;
case D:
    bar();
    baz(3);
    break;
case E:
    bar();
    baz(4);
    break;
}
因为每次都要重复bar(),或者

,这对我来说有点气味
switch(x) {
case A:
    baz(0);
    break;
case B:
    baz(1);
    break;
case C:
    baz(2);
    break;
case D:
    baz(3);
    break;
case E:
    baz(4);
    break;
}
if (x != A) { bar(); }

不会复制任何代码,但令我困扰的是,我需要同时使用switchif

我猜另一种选择是使用地图,比如

Map<X, Integer> m = new HashMap<X, Integer>();
m.put(A, 0);
m.put(B, 1);
m.put(C, 2);
m.put(D, 3);
m.put(E, 4);

if (m.get(x) == 0) {
    foo();
} else {
    bar();
}
baz(m.get(x));

但是现在我已经引入了一个完整的数据结构来清理它。 (当你计算地图的初始化时,它甚至不是那么干净。)

任何提示?

3 个答案:

答案 0 :(得分:11)

枚举是x吗?在这种情况下,只需将方法移动到枚举而不是切换。

enum Employee {
    SENIOR {
        @Override
        public int salary() {
            return 60;
        }
    },
    JUNIOR {
         @Override
         public int salary() {
            return 40;
         }
    };

    public abstract int salary ();
}

并致电

  employee.salary();

比切换要好得多。

是;你将不得不重复方法调用,但我认为这是正确和明确的。或者......在枚举中使用构造函数。借口将“员工”代码与“foobar”代码混合在一起。

   private final boolean flag;
   Employee(int flag) {
       this.flag = flag;
   }

   public int method() {
       if(flag) {
            secondMethod();
       }
       alwaysMethod();
   }

答案 1 :(得分:1)

我会将x传递给baz并在那里创建新的切换:

switch(x) {
case A:
    foo();
    break;
case B:
case C:
case D:
case E:
    bar();
    baz(x); // < --- 
    break;
}


void baz(SomeEnum val){
 switch(val) {/* ...*/}
}

答案 2 :(得分:0)

我猜你的案例是固定的,所以你可以使用枚举,只是排除其中一个。

public enum MyCase {
   A, B, C, D, E;
}

和条件

MyCase x;
...
if MyCase.A.equals(x) {
    foo();
} else {
    bar();
}
baz(x);
// or if the oridnal value is required
baz(x.ordinal);