#java #switch-statement
#java #switch-инструкция
Вопрос:
Я хочу вызывать методы из объекта из инструкции switch.
Здесь я включаю String
:
switch (properties.getProperty("my.property")) { // getProperty() retuns a String
case contains("something"):
doSomething();
break;
}
Могу ли я выполнять методы switch
‘ed объекта подобным образом? В основном я пытаюсь избежать выполнения:
case properties.getProperty("my.property").contains("something"):
Я почти уверен, что это безнадежное дело, но, возможно, я что-то пропустил…
Я пытался использовать contains()
и .contains()
безрезультатно. Должен ли я просто перестать пытаться быть ленивым? Или есть способ сделать это?
Комментарии:
1. используйте if, а не switch. переключение работает только при сравнении констант.
2. по сути, я должен перестать пытаться быть ленивым 🙂
3. Я вообще не понимаю, на что это похоже
.With
— это для установки нескольких свойств для одного объекта, это не для выбора одного набора инструкций для выполнения на основе существующего свойства.4. Я не VB.NET программист, я просто смутно припоминаю, что ты мог использовать этот тип синтаксиса
5. Что ж, взгляните на вопрос, на который вы ссылались. Похожи ли эти примеры на то, что вы пытаетесь сделать?
Ответ №1:
Нет, вы не можете. switch
/ case
инструкции предназначены для простого «это постоянное значение соответствует этому набору действий; это постоянное значение соответствует этому набору действий; …».
Если вам нужна более сложная обработка, вам следует просто использовать if
инструкции.
Комментарии:
1. Приятная встреча, Джон. Спасибо за это. Таково было мое понимание
switch
заявления, но я хотел укрепить свое понимание.
Ответ №2:
Как уже указывал @JonSkeet, вы не можете обобщать switch
инструкции, чтобы делать то, что вы пытаетесь сделать.
Однако в некоторых случаях вы можете «обмануть» это: например, со строками вы можете использовать switch
оператор для точных совпадений. В вашем случае вы также можете сделать это слегка запутанным способом с помощью регулярного выражения:
Pattern pattern = Pattern.compile("something|else");
Matcher matcher = pattern.matcher(properties.getProperty("my.property"));
switch(matcher.find() ? matcher.group() : "") {
case "something":
doSomething();
break;
case "else":
doSomethingElse();
break;
default:
doDefault();
}
Я не думаю, что вышеизложенное предлагает какое-либо улучшение по сравнению с очевидным подходом с if
s:
if(prop.contains("something")) {
doSomething();
} else if(prop.contains("else")) {
doSomethingElse();
}
Вторая версия и проще, и читабельнее. Возможно, и быстрее.
Ответ №3:
Если вы абсолютно хотите использовать switch, вы можете это сделать:
switch("true") {
case aFunctionThatReturnsTrueOrFalse():
}
На самом деле это не совсем правильно, но должно работать жестко
Комментарии:
1. Это (должно быть?) ошибка во время компиляции. Вы не можете поместить логические значения в переключатель.