Как вызвать дополнительный метод в перечислениях? - PullRequest
6 голосов
/ 11 мая 2011
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 для HUGE?

Если нет способа вызвать этот метод, почему Java рассматривает его как допустимый?

Ответы [ 4 ]

9 голосов
/ 11 мая 2011

(Как отмечалось почти 4 года спустя, мой первоначальный ответ был неверным.)

Вы даже не можете вызвать Enum1.HUGE.getCountry() с определенным перечислением, что очень немного удивительно ... но даже если бы вы могли, вы не могли бы сделать это с произвольным значением Enum1, которое было бы более общим полезно.

Решение состоит в том, чтобы не использовать его как дополнительный метод - добавьте метод getCountry() в Enum1, либо возвращая значение по умолчанию, либо, возможно, выбрасывая исключение. HUGE может затем переопределить метод.

Было бы неплохо, если бы вы могли объявить, что определенное значение перечисления реализовало интерфейс, но, похоже, для этого нет синтаксиса.

3 голосов
/ 11 мая 2011

enum - это определение типа, аналогичное классу, поэтому Enum1 не имеет метода getCountry(), доступного в его интерфейсе.

edit: Alternativeрешение

Что вы можете сделать - это определить необходимые методы в Enum1 и переопределить их в отдельных значениях перечисления.

2 голосов
/ 22 ноября 2016

Если нет способа вызвать этот метод, то почему java считается легальным?

Вы все еще можете вызывать его в пределах определения значения enum. Например, измените getName() функцию:

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

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

В противном случае вам необходимо переопределить его, чтобы иметь возможность вызвать его.

1 голос
/ 07 февраля 2017

Это совсем не удивительно.

Когда вы определяете тип 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!");
    }
};

Однако такие методы доступны из самой декларации, например, , указанный в этом ответе .

Примечание: Как и Йоахим Зауэр сказал в своем комментарии , это может быть не самый лучший дизайн.Вы должны, например, переместить ваши методы к типу Enum1.


Существует еще способ.Доступ к методу можно получить с помощью отражения:

Class<?> clazz = Enum1.HUGE.getClass();
Method method = clazz.getMethod("getCountry");
System.out.println(method.invoke(Enum1.HUGE)); // Prints "India"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...