альтернатива оператору if в java
-
06-07-2019 - |
Вопрос
Мне любопытно увидеть какие-либо альтернативы обычным операторам if, таким как
if(x)
do a;
if(y)
do b;
if(z)
do c;
итак, как вы видите, все операторы if являются отдельными и никаких других условий нет.Пожалуйста, обратите внимание, что X Y Z - это полностью отдельные условия, поэтому switch не подойдет.
Решение
Один «действительно объектно-ориентированный» Ответ будет заключаться в определении интерфейса для «Правило» (с помощью методов condition () и action ()) создайте 3 реализации, поместите их в коллекцию, а затем просто переберите их в общем виде, как в:
List<Rule> rules = .... ; // your 3 rules initialized here somehow for(Rule r : rules) { if(r.condition()) { r.action(); } }
Это имеет больше смысла, если у вас есть 300 правил / условий, а не только 3.
В Java8 вы можете сделать это вместо этого, если правила интенсивно используют процессор:
rules.parallelStream().filter(Rule::condition).forEach(Rule::action);
Другие советы
Короткий ответ - да. Р>
Есть несколько раз, когда вы можете избежать использования if для условного выделения и ветвления всего вместе. И у них есть моменты уместности. Р> <Ол>
Ссылочное присвоение, когда вы знаете возможные начальные значения, и они имеют соотношение 1 к 1 с возвращаемыми значениями. Списки лучше, чем массивы для этого, но ...
Р>
// Example: if (a==1) { b=2; } if (a==2) { b=17; } // Becomes int fx(2); // our array of answers fx[0] = 2; fx[1] = 17; b = fx[ a - 1 ];
Ссылочное ветвление, когда вы знаете возможные начальные значения, и они имеют соотношение 1: 1 к используемой функции / ветви. (пример не Java)
// Example: if (a==1) { doSomething1(); } if (a==2) { doSomething2(); } // Becomes function * fx(2); // our array or better still, list of functions fx[0] = &doSomething1; fx[1] = &doSomething2; `fx[ a - 1 ](); `
Прямое логическое назначение. Р>
Мы ненавидим:
if (thisCondition == true) { b = true; } else { b = false; }
Должно быть:
b = thisCondition;
Альтернативами if-else
в Java являются оператор switch и условный троичный оператор (?: ), ни один из которых не выполняет в точности то, что вы спрашиваете (обрабатывает только if
без else
). Код, который вы разместили, по моему мнению, лучший способ сделать это.
Используйте полиморфизм.
interface SomethingDoer {
public void doSomething();
}
class ADoer implements SomethingDoer { ... }
class BDoer implements SomethingDoer { ... }
class CDoer implements SomethingDoer { ... }
public class Main {
public static void main (String[] args) {
SomethingDoer doer = new SomethingDoerFactory(args).getDoer();
doer.doSomething();
}
}
If не полностью исключено, но оно перемещено в SomethingDoerFactory. Это решение применимо не во всех случаях, но в некоторых из них это очень хорошая альтернатива множественным if.
Вот хороший разговор об этом:
http://misko.hevery.com / 2008/12 / 08 / чистое-код Общение наследование-полиморфизм тестирование /
это самое простое, читабельный, но эффективный решение.Я был бы удивлен, увидев здесь эффективные альтернативы.
Редактировать
вы можете попробовать применить способ извлечения несколько раз:
doAIfX();
doBIfY();
doCifZ();
где методы определяются с помощью:
void doAIfX() {
if (!X) {
return;
}
// do 'a'
}
это действительно зависит от того, что x, y, z и a, b, c. Иногда, если заявления более подходят. Иногда полиморфизм более подходит.
Вам понадобятся эти операторы if где-нибудь. Р>
Они могут быть преобразованы в другие методы, чтобы сохранить настоящий метод в чистоте, как предлагали другие. Если вам необходимо повторно использовать тот же набор операторов if в нескольких местах, возможно, можно использовать Шаблон декоратора .
Звучит как идеальный случай для использования закрытия . Но для этого вам нужно groovy или что-то подобное.
Как насчет...myAnimator(вещь, pos, скорость | computeSpeed());
если скорость === неопределенный затем он увеличит скорость вычислений...Я думаю.
Это действительно зависит от контекста ... но да, если-еще только один из потока управления оператора в Java: https://docs.oracle.com/javase/tutorial/java/ nutsandbolts / flow.html р>