如何在枚举中调用其他方法?

enum Enum1 { BIG(8), HUGE(10) { public String getName() { return "Huge"; } public String getContry() { return "India"; }//additional Method }, OVERWHELMING(16) { public String getName() { return "OVERWHELMING"; } }; private int ounces; public int getOunes() { return ounces; } public String getName() { return "Ponds"; } Enum1(int ounces1) { ounces = ounces1; } } class EnumAsInnerClass { Enum1 enumInnerClass; public static void main(String[] args) { EnumAsInnerClass big = new EnumAsInnerClass(); big.enumInnerClass = Enum1.BIG; EnumAsInnerClass over = new EnumAsInnerClass(); over.enumInnerClass = Enum1.OVERWHELMING; EnumAsInnerClass huge = new EnumAsInnerClass(); huge.enumInnerClass = Enum1.HUGE; System.out.println(big.enumInnerClass.getName());//Ponds System.out.println(over.enumInnerClass.getName());//OVERWHELMING System.out.println(huge.enumInnerClass.getName());//Huge } } 

考虑上面的例子。 如何调用方法getCountry for HUGE?

如果无法调用此方法,为什么Java将其视为合法?

(正如近4年后所说,我原来的答案是错误的。)

你甚至不能用特定的枚举调用Enum1.HUGE.getCountry() ,这是非常令人惊讶的…但即使你可以,你也不能使用任意的Enum1值,这通常是有用的。

解决方案是阻止它成为一个额外的方法 – 在Enum1添加一个getCountry()方法,返回默认值或者抛出exception。 然后, HUGE可以覆盖该方法。

如果你可以声明一个特定的枚举值实现了一个接口,那将是很好的,但它似乎没有语法。

enum是类型定义,类似于类,因此Enum1中没有getCountry()方法。

编辑:替代解决方案

可以做的是在Enum1定义所需的方法,并在各个枚举值中覆盖它们。

如果没有办法调用这个方法那么为什么java视为合法?

您仍然可以在枚举值定义中调用它。 例如,更改getName()函数:

 // ... HUGE(10) { public String getName() { // Call additional Method return "Huge" + getCountry(); } public String getContry() { return "India"; } // additional Method }, // ... 

否则,您需要覆盖它才能调用它。

这根本不足为奇。

当您定义enum类型(在您的情况下为Enum1 )并为其声明值时,它们的引用类型将是已定义的类型( Enum1 )。 在enum声明中定义方法时,您刚刚创建了匿名子类

 public enum Enum1 { OVERWHELMING(16) { public String getName() { return "OVERWHELMING"; } }; // And the remaining constructors, fields and methods } 

而且你不能通常从定义本身之外调用匿名类的方法。 同样, someOtherMethod()也无法从外部访问:

 ActionListener al = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { someOtherMethod(); } public void someOtherMethod() { System.out.println("Some other method!"); } }; 

但是,这些方法可以从声明本身获得,如本答案中所述 。

注意:就像Joachim Sauer在评论中所说,这可能不是最好的设计。 例如,您应该将方法移动到Enum1类型。


还有一种方法。 可以通过reflection访问该方法:

 Class clazz = Enum1.HUGE.getClass(); Method method = clazz.getMethod("getCountry"); System.out.println(method.invoke(Enum1.HUGE)); // Prints "India"