在switch语句(Java)中重用代码
我想使用在switch语句(Java)中重用代码,java,switch-statement,Java,Switch Statement,我想使用switch语句,但如果不复制代码或使用附带的if语句,我无法构造它。有办法解决这个问题吗 我有5个案例,除了其中一个之外,我都希望执行特定的操作。因此,使用switch语句,我可以: switch(x) { case A: foo(); break; case B: case C: case D: case E: bar(); break; } 简单。但困难在于,我还需要为每个案例执行另一个不同的操作,因此我不能使用案例的fall-through功能。
switch
语句,但如果不复制代码或使用附带的if
语句,我无法构造它。有办法解决这个问题吗
我有5个案例,除了其中一个之外,我都希望执行特定的操作。因此,使用switch
语句,我可以:
switch(x) {
case A:
foo();
break;
case B:
case C:
case D:
case E:
bar();
break;
}
简单。但困难在于,我还需要为每个案例执行另一个不同的操作,因此我不能使用案例的fall-through功能。所以我只能选择其中之一
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(); }
它不会复制任何代码,但让我烦恼的是,我需要同时使用开关
和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));
Map m=newhashmap();
m、 put(A,0);
m、 put(B,1);
m、 put(C,2);
m、 put(D,3);
m、 put(E,4);
如果(m.get(x)==0){
foo();
}否则{
bar();
}
baz(m.get(x));
但是现在我引入了一个完整的数据结构来清理这个问题。(当您计算地图的初始化时,它甚至没有那么干净。)
有什么提示吗?我会将逻辑通过
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) {/* ...*/}
}
开关(x){
案例A:
foo();
打破
案例B:
案例C:
案例D:
案例E:
bar();
baz(x);/<--
打破
}
void baz(SomeEnum val){
开关(val){/*…*/}
}
是否x
可能是枚举?在这种情况下,只需将方法移动到枚举,而不是切换
enum Employee {
SENIOR {
@Override
public int salary() {
return 60;
}
},
JUNIOR {
@Override
public int salary() {
return 40;
}
};
public abstract int salary ();
}
和呼唤
employee.salary();
这比切换要好得多
enum Employee {
SENIOR {
@Override
public int salary() {
return 60;
}
},
JUNIOR {
@Override
public int salary() {
return 40;
}
};
public abstract int salary ();
}
对,;您将不得不重复方法调用,但我认为这是正确和明确的。或在枚举中使用构造函数。请原谅人为地将“员工”代码与“foobar”代码混用
我猜您的案例是固定的,因此您可以使用enum并仅排除其中一个
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);
如果(arg==0)bar(),您不能/不想添加
代码>到baz
?我想我可以,但我希望它更一般。。。事实上,在我的代码中,它甚至不是bar()
,它只是一个赋值语句。是的,x
是一个枚举。我想你已经了解了一些东西。我最喜欢这个解决方案,在枚举中使用构造函数,而不是重复方法定义。谢谢,用A,B,C。。。还有福,巴。。。实际上,这会使它更容易理解。OPs问题。是的,很好的解决方案,但imo使用带参数的枚举构造函数更好。不知道枚举中的方法,这里有一个很好的阅读: