Действительно ли возможно передать аргументы в ценности Энума?

Предположим, что мне определили Enum что-то вроде этого:

public enum Sample{
   //suppose AClass.getValue() returns an int
    A(AClass.getValue()), 
    B(AClass.getValue()),
    C(AClass.getValue());

    private int _value; 

    private Sample(int _val){
        this._value = _val; 
    }

    public int getVal(){
        return _value; 
    }

Я могу выйти из дела, ценности, используя Образец. или Образец. A.getAVal() без проблемы.

Теперь предположите, что AClass.getValue() мог взять параметр, чтобы возвратить возможно различную конкретную стоимость, например, AClass.getValue (42) .

Возможно передать аргументы общественному методу Enum и retrive ценности Enum? Другими словами, мог я иметь определение Enum как

    public enum Sample{
       //suppose AClass.getValue() returns an int
        A(AClass.getAValue()), 
        B(AClass.getBValue()),
        C(AClass.getCValue());

        private int _value; 

        private Sample(int _val){
           this._value = _val; 
        }

        public int getVal(){
            return _value; 
        }

        public int getVal(int a){
           //somehow pull out AClass.getAValue(a)
        }

использование Образец. A.getValue (42) ?

3
nl ja de
Вы подразумеваете, что хотите иметь различные случаи того же самого перечисления значений?
добавлено автор Denys Séguret, источник
What' s точная потребность?
добавлено автор Denys Séguret, источник
Это кажется, что вам нужна постоянная карта, не enum.
добавлено автор Michael Myers, источник
Я знал, поскольку я писал этот вопрос, что я, вероятно, делал что-то отрывочное...
добавлено автор joshin4colours, источник

3 ответы

Можно сделать это, но только делая абстрактный метод в enum и отвергая его в каждой стоимости:

public enum Sample {
    A(AClass.getAValue()) {
        @Override public int getVal(int x) {
            return AClass.getAValue(x);
        }
    },
    B(BClass.getAValue()) {
        @Override public int getVal(int x) {
            return BClass.getBValue(x);
        }
    },
    C(CClass.getAValue()) {
        @Override public int getVal(int x) {
            return CClass.getCValue(x);
        }
    };

    private int _value; 

    private Sample(int _val){
       this._value = _val; 
    }

    public int getVal(){
        return _value; 
    }

    public abstract int getVal(int x);
}

Конечно, если вы могли бы создать случай некоторых другой базовый тип, который имеет getValue (интервал x) метод, тогда вы могли поместить код в сам класс Enum вместо во вложенные.

4
добавлено
Спасибо за это! Это действительно указывает что этот isn' t дорога я должен спуститься.
добавлено автор joshin4colours, источник

As stated in Java Specification

есть только один случай каждой enum константы

Так не, у вас не может быть различных ценностей определенной enum константы.

Но вы могли поместить множество или карту в вашем enum, так Образец. A.getValue (42) возвратился бы Образец. A.myMap.get (42) :

public enum Sample{
        A(), 
        B(),
        C();

        Map myMap = new HashMap();


        public int getVal(int i){
            return myMap.get(i); 
        }
        public int setVal(int i, int v){
            return myMap.put(i, v); 
        }
}
1
добавлено
public class App {
    public static void main(String[] args) {
        Fruit.setCounter(5);
        System.out.println(Fruit.Apple.getCmd());
        Fruit.setCounter(6);
        System.out.println(Fruit.Apple.getCmd());
    }
}

public enum Fruit {
    Apple {
        public String getCmd() {
            return counter + " apples";
        }
    },
    Banana {
        public String getCmd() {
            return counter + " bananas";
        }
    };

    private static int counter = 0;

    public abstract String getCmd();

    public static void setCounter(int c) {
        counter = c;
    }
}




Output:
5 apples
6 apples
1
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async