从another question中,我了解到在中可以为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();
}我该如何使用这些“排他性”方法?
发布于 2011-07-01 18:39:18
您不能引用这些方法,因为您实际上正在为每个枚举创建匿名(*)类。由于它是匿名的,所以只能从匿名类本身或通过反射引用此类方法。
当您在枚举中声明抽象方法并为每个枚举单独实现该方法时,这种技术非常有用。
(*) JLS 8.9 enum部分说:“枚举常量的可选类主体隐式定义了一个匿名类声明(§15.9.5),它扩展了立即包围枚举类型。”
发布于 2011-07-01 18:48:41
每个enum都是一个匿名的内部类。因此,与任何匿名内部类一样,您可以添加所需的所有方法,但无法在类之外引用它们,因为该类没有定义方法的类型。
允许enum实现上的方法的优点是它允许一种策略模式,其中枚举本身有一个抽象方法或一个默认实现,而enum的特定成员具有该方法的实现,这些实现可能会做一些不同的事情。
我使用这种技术大大降低了开关语句的代码复杂度。而不是在其他类中打开枚举,只需获得对它的引用并调用方法,让枚举本身来处理它。当然,这取决于场景是否有意义,但它可以极大地降低代码复杂性。
https://stackoverflow.com/questions/6551851
复制相似问题