从另一个问题我了解到,在Java中可以为Enum的每个实例定义特定的方法:
public class AClass {
private enum MyEnum{
A { public String method1(){ return null; } },
B { public Object method2(String s){ return null; } },
C { public void method3(){ return null; } } ;
}
...
}
我很惊讶这甚至是可能的,这个特定于每个实例的“专有方法”是否有一个名称来查找文档?
另外,应该如何使用?因为下一个没有编译:
private void myMethod () {
MyEnum.A.method1();
}
我该如何使用这些“独家”方法?
您需要在枚举中声明抽象方法,然后在特定的枚举实例中实现。
class Outer {
private enum MyEnum {
X {
public void calc(Outer o) {
// do something
}
},
Y {
public void calc(Outer o) {
// do something different
// this code not necessarily the same as X above
}
},
Z {
public void calc(Outer o) {
// do something again different
// this code not necessarily the same as X or Y above
}
};
// abstract method
abstract void calc(Outer o);
}
public void doCalc() {
for (MyEnum item : MyEnum.values()) {
item.calc(this);
}
}
}
您无法引用这些方法,因为您实际上是在为每个枚举创建匿名 (*) 类。由于它是匿名的,因此您只能从匿名类本身内部或通过反射来引用此类方法。
当您在枚举中声明抽象方法并为每个枚举单独实现该方法时,此技术非常有用。
(*) JLS 8.9 枚举部分说:“枚举常量的可选类主体隐式定义了一个匿名类声明(第 15.9.5 节),该声明扩展了直接封闭的枚举类型。”
每个
enum
都是一个匿名内部类。因此,与任何匿名内部类一样,您可以添加所需的所有方法,但无法在类外部引用它们,因为该类没有定义方法的类型。
在
enum
实现上允许方法的优点是它允许策略模式,其中枚举本身具有抽象方法或默认实现,并且 enum
的特定成员具有该方法的实现,可以执行以下操作一些不同的东西。
我使用这种技术大大降低了 switch 语句的代码复杂性。无需在其他类中打开枚举,只需获取对它的引用并调用方法,然后让枚举本身来处理它。当然,这取决于场景是否有意义,但它可以极大地降低代码复杂性。