枚举:每个实例独有的方法

2022-09-01 22:53:40

另一个问题中,我了解到在Java中可以为枚举的每个实例定义特定方法

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();
    }

我应该如何使用这些“独家”方法?


答案 1

您需要在枚举中声明抽象方法,然后在特定的枚举实例中实现这些方法。

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);
        }
    }
}

答案 2

不能引用这些方法,因为您实际上是在为每个枚举创建匿名 (*) 类。由于它是匿名的,因此您只能从匿名类本身内部或通过反射来引用这些方法。

当您在枚举中声明抽象方法并为每个枚举单独实现该方法时,此技术最有用。

(*)JLS 8.9 枚举部分说:“枚举常量的可选类体隐式定义了一个匿名类声明(§15.9.5),该声明扩展了立即封闭的枚举类型。