Зачем нам метод вне метода enum constant, хотя у нас уже есть разные методы для каждой константы? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь сделать enum, используя функцию для всех констант и определяя функцию для каждой константы, скажем, например, информацию для цвета GREEN и другие, но зачем мне определять абстрактную функцию длято же самое, хотя у меня уже есть отдельные функции для каждой константы, которую я имею для enum.

enum color {
    GREEN {
        public void info() {
            System.out.println("Dangerous Color: GREEN");
        }   
    },
    RED {
        public void info() {
            System.out.println("Dangerous Color");
        }
    },
    BLUE {  
        public void info() {
            System.out.println("Ordinary universal colour: BLUE");
        }    
    };         
      public void info() { System.out.println("Ordinary universal colour"); }         
    public abstract void info();    
}   
public class EnumDemo4 {    
    public static void main(String[] args) {    
        color[] c = color.values();
        for (color c1 : c) {
            System.out.println(c1);
            c1.info();    
        }
    }    
}

Зачем нам нужен метод вне enum метода констант, хотя у нас уже есть разные методы для каждой константы?

Почему мы требуем добавить абстрактный ИЛИ не абстрактный метод, хотя мы уже определили функцию для соответствующей константы?

1 Ответ

0 голосов
/ 06 февраля 2019

Прежде всего, ваш код не компилируется.Вы не можете определить info() дважды в одном и том же перечислении.

Эта строка должна быть удалена: public void info() { System.out.println("Ordinary universal colour"); }

В любом случае, когда вы ожидаете, что это сработает?Он не связан ни с одним цветом.

Правильное определение будет выглядеть следующим образом:

enum Color {
    GREEN {
        @Override
        public void info() {
            System.out.println("Dangerous Color: GREEN");
        }   
    },
    RED {
        @Override
        public void info() {
            System.out.println("Dangerous Color");
        }
    },
    BLUE {  
        @Override
        public void info() {
            System.out.println("Ordinary universal colour: BLUE");
        }    
    };         

    public abstract void info();    
}   

Причина, по которой вам нужно определить abstract void info() на уровне перечисления, заключается в том, что вы хотите применитьчто все константы в вашем перечислении обеспечивают это.Это гарантирует, что все экземпляры перечисления предоставят его, поэтому строка c1.info() в вашей функции main() работает.

Если вы попытаетесь удалить abstract void info(), ваши константы будут по совпадению каждый имеет info() реализованный, но ничего не говорит компилятору, что на уровне enum Color он всегда будет у вас.Таким образом, он не будет компилироваться.

Если вы хотите получить чуть менее громоздкое определение, вы можете изменить его следующим образом, что делает то же самое:

enum Color {
    GREEN("Dangerous Color: GREEN"),
    RED("Dangerous Color"),
    BLUE("Ordinary universal colour: BLUE");

    private final String info;

    Colour(String info) {
      this.info = info;
    }

    public void info() {
       System.out.println(info);
    }    
}   
...