Преобразовать строку в Enum? - PullRequest
0 голосов
/ 30 ноября 2009

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

public static enum InstrumentType {
    SPOT {
        public String toString() {
            return "MKP";
        }
    },
    VOLATILITY {
        public String toString() {
            return "VOL";
        }
    };

    public static InstrumentType parseXML(String value) {
        InstrumentType ret = InstrumentType.SPOT;

        for(InstrumentType instrumentType : values()) {
            if(instrumentType.toString().equalsIgnoreCase(value)) {
                ret = instrumentType;
                break;
            }
        }

        return ret;
    }
} 

Я хочу добавить в функцию новый параметр, который будет представлять любое перечисление. Я знаю, что должен использовать шаблоны, но я не могу использовать функцию «values ​​()» тогда внутри кода функции. По сути, мне нужна функция valueOf, которая использует определенное мной значение toString ().

Заранее спасибо.

Ответы [ 2 ]

16 голосов
/ 30 ноября 2009

Попробуйте более чистый способ написания вашего перечисления:

public static enum InstrumentType {

    SPOT("MKP"),
    VOLATILITY("VOL");

    private final String name;

    InstrumentType(String name)
    {
        this.name = name;
    }

    public String toString()
    {
        return this.name;
    }

    public static InstrumentType getValue(String s)
    {
        for (InstrumentType t : InstrumentType.values())
        {
            if (t.toString().equals(s))
                return t;
        }
        return SOME_DEFAULT_VALUE;
    }
}

Это также решает вашу проблему с String -> Enum. Возможно, будет проще использовать трехбуквенные акронимы в качестве имени перечисления, но в случае, если вам нужно будет принять решение getValue() в соответствии с другими параметрами, это правильный путь.

0 голосов
/ 30 ноября 2009

Я считаю, что Enums может реализовывать интерфейсы, поэтому вы можете определить его с помощью метода values ​​(), а затем использовать его в качестве типа параметра.

Но, как сказал комментатор, было бы проще, если бы вы назвали свои перечисления MKP, VOL и т. Д.

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