虽然看起来不太美观,但是对于这种非平凡问题的解决方案,大多数都只是在将丑陋的部分移到别处。
例如,您可以将三种不同的行为封装在某个接口的三个不同实现中,然后将不同的行为实现传递给每个枚举的构造函数。(这基本上是其他人建议的命令或策略方法)。
如果您将这些实现和接口作为单独的类进行处理,则可能会将该行为暴露到枚举之外,这是不必要的,而且可以说是丑陋的。
如果您将它们设置为枚举的私有静态内部类,则将丑陋的部分从文件顶部移动到文件底部。这样做是否更加美观取决于观察者的眼光。
public enum Foo {
ONE(new OneDelegate()),
TWO(new TwoDelegate()),
THREE(new ThreeDelegate());
private final FooDelegate delegate;
private Foo(FooDelegate delegate) {
this.delegate = delegate;
}
public String doStuff(String stuff) {
return delegate.doStuff(stuff);
}
private static interface FooDelegate {
String doStuff(String stuff);
}
private static class OneDelegate implements FooDelegate {
@Override
public String doStuff(String stuff) {
return "One " + stuff;
}
}
private static class TwoDelegate implements FooDelegate {
@Override
public String doStuff(String stuff) {
return "Two " + stuff;
}
}
private static class ThreeDelegate implements FooDelegate {
@Override
public String doStuff(String stuff) {
return "Three " + stuff;
}
}
}
另一个显而易见的解决方案是将所有三种行为作为私有方法放入,并在公共方法中加入
switch(this)
。个人认为这很丑陋,但许多前C程序员似乎喜欢它。
:)
public enum Foo {
ONE, TWO, THREE;
public String doStuff(String stuff) {
switch(this) {
case ONE:
return doStuffOne(stuff);
case TWO:
return doStuffTwo(stuff);
case THREE:
return doStuffThree(stuff);
}
}
private static String doStuffOne(String stuff) {
return "One " + stuff;
}
private static String doStuffTwo(String stuff) {
return "Two " + stuff;
}
private static String doStuffThree(String stuff) {
return "Three " + stuff;
}
}