альтернатива инструкции if в java

Мне любопытно увидеть любую альтернативу(ы) регулярным операторам if, таким как

if(x)
     do a;
if(y)
     do b;
if(z)
    do c;

так как вы видите, что все операторы if являются отдельными и не имеют других условий. Обратите внимание, что X Y Z полностью разделены, поэтому переключатель не подходит.

10 ответов


один" истинно объектно-ориентированный " ответ состоял бы в том, чтобы определить интерфейс для "правила" (с методами 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);

короткий ответ-да.

есть несколько раз вы можете не использовать, если для условного оценивания и ветвления все вместе. И у них бывают моменты уместности.

  1. полиморфизм, когда поведение зависит от начальных значений
  2. Referrenced Назначение, Когда вы знаете возможные начальные значения и они имеют 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 ];
    
  3. ссылочное ветвление, когда вы знаете возможные начальные значения и у них есть корреляция 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 ](); `
    
  4. прямое логическое задание.

    мы ненавидим:

    if (thisCondition == true) {  
      b = true;  
    } else {  
      b = false;  
    }
    

    должно быть:

    b = это условие;


альтернативы if-else в Java есть оператор switch и условного тернарного (?:) оператор, ни один из которых не делает именно то, что вы просите (обрабатывать только if С else). Код, который вы выложили-это лучший способ сделать это, на мой взгляд.


Это самый простой, читаемый, но эффективный решение. Я был бы удивлен, увидев здесь эффективные альтернативы.

редактировать

вы можете попробовать применить извлечение метода несколько раз:

doAIfX();
doBIfY();
doCifZ();

где методы определяются:

void doAIfX() {
    if (!X) {
        return;
    }

    // do 'a'
}

использовать полиморфизм.

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. Это решение применимо не во всех случаях, но в некоторых из них это очень хорошая альтернатива нескольким ifs.

вот хороший разговор о it:
http://misko.hevery.com/2008/12/08/clean-code-talks-inheritance-polymorphism-testing/


Это действительно зависит от того, что x, y, z и a, b, c. Иногда, если утверждения более подходят. Иногда полиморфизм более подходит.


вам нужно будет иметь эти операторы if где-то.

Они могут быть переработаны в другие методы, чтобы сохранить настоящий метод чистым, как предлагали другие. Если вам нужно повторно использовать это же set из if заявления в ряде мест, это может можно использовать Шаблон "Декоратор".


Это звучит как идеальный случай для использования закрытие. Но для этого вам нужно в Groovy или что-то подобное.


Как насчет... myAnimator (thing, pos, speed / computeSpeed ());

Если скорость === неопределено затем он будет computeSpeed... Я думаю.


Это действительно зависит от контекста... Но да, если-еще только один из поток управления оператор в java: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/flow.html