如何在枚举中调用其他方法?
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"