我有以下代码:
enum Example {
ex1,ex2
}
public void method(Example exType) {
if(exType.equals(ex1)) {
//do similar stuff
method2(exType)
} else if(exType.equals(ex2)) {
//do similar stuff
method2(exType)
} else {
//throw exception
}
}
public void method2(Example exType) {
if(exType.equal(ex1)) {
//do similar stuff
} else if(exType.equals(ex2)) {
//do similar stuff
} else {
//throw exception
}
}
问题在于该方法调用行为相同的其他方法。因此,它看起来不是很好的实现。我该如何分割这种行为?
编辑:
使用枚举不是强制性的。类似的意思是他们调用了同名方法并更新了同名字段,一个只比另一个少。在//Do similar stuff
内部,它调用另一个以枚举为参数的方法,该方法具有相同的代码结构。
编辑2: 添加了更多代码。这似乎不是正确的方法
答案 0 :(得分:2)
值得记住的是,枚举值是对象,而不是像其他语言中的int
值。在许多情况下,这使您可以将多态与它们一起使用,从而无需使用switch语句。
interface IExample {
// you can use interfaces if you need them
void method1();
}
enum Example implements IExample {
ex1 {
public void method1() {
// do stuff
method2();
}
public void method2() {
// do other stuff
}
},
ex2 {
public void method1() {
// do stuff
method2();
}
public void method2() {
// do other stuff
method3(); // not all methods need to be different.
}
};
public abstract void method1(); // only needed if you don't use an interface
public abstract void method2(); // does it need to be public as well?
public void method3() { /* added as an example */ }
}
如果您忘记为新的enum
值提供实现,则无需编译代码,因此无需抛出异常。
IExample
可能是现有接口,或者可能需要扩展。例如
class Example2 implements IExample {
int x;
public Example2(int x) { this.x = x; }
public void method1() {
// uses x
}
}
现在您可以写
IExample e = Example.ex1; // fixed value
IExample e2 = new Example2(5); // extendable at runtime.
您为什么要这样做?
我有一个例子。
SystemTimeProvider-实现为enum
SetTimeProvider一个类,其中每个实例出于测试目的可以具有不同的固定时间。
答案 1 :(得分:0)
我会改用switch
。同样,您可以使用Enums
使用==
,但是使用switch
时则不需要。那怎么办!
enum Example {
ex1,ex2
}
public void method(Example exType) {
switch (exType) {
case ex1:
// do 1
break;
case ex2:
// do 2
break;
default:
//throw exception
}
}
答案 2 :(得分:0)
首先最好使用switch case
,因为在将来的情况下,枚举数将更多,如果条件使代码的可读性降低,则数将变得更多。
一种方法可能是
enum Example {
ex1,ex2
}
public void method(Example exType) {
switch (exType) {
case ex1:
methodEx1();
break;
case ex2:
methodEx1();
break;
default:
//throw exception
}
}
函数methodEx1();和methodEx2();将与枚举对应的所有代码添加到一个函数中,而不是为同一个枚举编写多个函数。