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

时间:2011-05-11 06:07:14

标签: java enums

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 个答案:

答案 0 :(得分:9)

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

你甚至无法使用特定的枚举来调用Enum1.HUGE.getCountry(),这有点令人惊讶......但即使你可以,也不能使用任意Enum1值,会更有用。

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

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

答案 1 :(得分:3)

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

编辑替代解决方案

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

答案 2 :(得分:2)

  

如果无法调用此方法,那么为什么java会视为合法?

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

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

    public String getContry()
    {
        return "India";
    } // additional Method
},
// ...

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

答案 3 :(得分:1)

这根本不足为奇。

当您定义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!");
    }
};

但是,这些方法可以从声明本身访问,例如stated in this answer

注意:与Joachim Sauer中提到的his comment一样,这可能不是最好的设计。例如,您应该将方法移至Enum1类型。

仍有 方式。可以通过反射访问该方法:

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