我想使用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(); }
它不会复制任何代码,但令我困扰的是,我需要使用switch
和if
。
我猜另一种选择是使用地图,比如
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));
但是现在我已经引入了一个完整的数据结构来清理它。 (当你计算地图的初始化时,它甚至不是那么干净。)
有小费吗?
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();
}
我会通过将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) {/* ...*/}
}
我想你的案例是固定的,所以你可以使用枚举,只是排除其中一个。
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);