Вопрос по case, tostring, enums, switch-statement, java – Использование строковых представлений значений перечисления в switch-case

12

Почему нельзя использовать значения перечисления в качестве строк в случае переключателя? (Или что не так с этим :)

<code>String argument;
switch (argument) {
    case MyEnum.VALUE1.toString(): // Isn't this equal to "VALUE1" ?
    // something    
break;
    case MyEnum.VALUE2.toString():
    // something else
break;
</code>

Ваш Ответ

4   ответа
-1

EDIT: Извинения за ответ C # на вопрос Java. Я не знаю, что там пошло не так.

Этоis Возможно использование строковых значений (включая строковые значения перечислений). Тем не менее, вы можете использовать толькоcompile-time constants, Вы вызываете метод,ToString(), который должен быть оценен во время выполнения.

Начиная с C # 6, вы можете использовать эту постоянную альтернативу:case nameof(SomeEnum.SomeValue):

Nameof () вычисляется во время компиляции, просто в строку, которая соответствует (неквалифицированному) имени данной переменной, типа или члена. Его значение соответствует значениюSomeEnum.ToString().

1

этот сообщение из прошлого года, в котором обсуждается включение строки в Java до и после JDK7.

Даже не знал, что это было невозможно до JDK7. Спасибо, нашел отличную ссылку об этом в комментарии там:link - это лучший способ обработки ввода строки тогда? Bloke
Ну, пурист может сказать, что вы вообще не должны использовать оператор switch / case на языке ООП; вместо этого вам следует придерживаться стратегии полиморфизма для решения чего-то подобного. IMO, если он понятен, лаконичен, удобен в обслуживании и эффективен, случай / переключение является лучшим решением во многих сценариях.
6

t this equal to "VALUE1" ?

Нет, не обязательно: вы можете предоставить собственную реализациюtoString()

public enum MyType {
VALUE1 {
    public String toString() {
        return "this is my value one";
    }
},

VALUE2 {
    public String toString() {
        return "this is my value two";
    }
}

}

Более того, тот, кто поддерживает ваш код, может добавить эту реализацию после того, как вы покинете компанию. Вот почему вы не должны полагаться на строковые значения и придерживаться числовых значений (как представлено константами).MyEnum.VALUE1, MyEnum.VALUE2и т. д.) вашегоenumвместо.

О верно. Это хорошее объяснение, спасибо. Bloke
& quot; числовые значения ваших перечислений & quot ;? Вы имеете в виду имена констант перечисления ваших перечислений?
@assylias Конечно, я определенно имею в виду использование константных имен, а не целочисленных литералов, которые соответствуют этим именам! Спасибо, я отредактировал ответ, чтобы отразить этот важный момент.
26

которые известны во время компиляции. Компилятор не может определить результат этого выражения.

Возможно, вы можете попробовать

String argument = ...
switch(MyEnum.valueOf(argument)) {
   case VALUE1:

   case VALUE2:
Черт,valueOf() не вcase совсем. Я удаляю этот предыдущий комментарий, не могу его посмотреть. Еще раз спасибо. Bloke
Будьте осторожны с valueOf (), который выдает NPE и IllegalArgumentException, если аргумент недопустим. Код Bloke имеет смысл избегать обработки этих исключений (но, к сожалению, это не работает).
Важно то, чтоVALUE1 статичен Вы могли бы иметь свой собственныйmyValueOf() и это все равно будет работать.

Похожие вопросы