在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使用带参数的枚举构造函数更好。不知道枚举中的方法,这里有一个很好的阅读: