2014-12-04 3 views
0

Доброе утро/день/ночь,Использование оператора OR внутри if или else else if?

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

Мне было интересно, какой из них будет считаться «лучшим», чтобы использовать это, будет ли он использовать ряд || операторы в пределах одного, если, как показано ниже:

private boolean isCodeSpecial(String code){ 
    if(code.equalsIgnoreCase("AA") || 
     code.equalsIgnoreCase("AB") || 
     code.equalsIgnoreCase("SS") || 
     code.equalsIgnoreCase("DD") || 
     code.equalsIgnoreCase("YY") || 
     code.equalsIgnoreCase("ZZ") || 
     code.equalsIgnoreCase("AX")){ 
     return true; 
    } 
    return false; 
} 

Или, возможно, используя ряд еще, если заявления, как ниже:

private boolean isCodeSpecial(String code){ 
    if(code.equalsIgnoreCase("AA")){ 
     return true; 
    }else if(code.equalsIgnoreCase("AB")){ 
     return true; 
    }else if(code.equalsIgnoreCase("SS")){ 
    return true; 
    }else if(code.equalsIgnoreCase("DD")){ 
     return true; 
    }else if(code.equalsIgnoreCase("YY")){ 
     return true; 
    }else if(code.equalsIgnoreCase("ZZ")){ 
     return true; 
    }else if(code.equalsIgnoreCase("AX")){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

Я не очень обеспокоен производительности в этом приложении, как я знаю, любые выигрыши/штрафы, вероятно, будут минимальными и почти незаметными - но, если возможно, я хотел бы знать, что в целом считается лучшей практикой для будущих ссылок. Думаю, можно было бы утверждать, что это именно то, что еще нужно для?

Спасибо заранее,

Edit: Забыл упомянуть, что я использую Java 1.6

ответ

9

Зачем использовать if заявление на (так я не считаю простой переключатель возможно без использования Перечисления?) все?

return code.equalsIgnoreCase("AA") || 
    code.equalsIgnoreCase("AB") || 
    code.equalsIgnoreCase("SS") || 
    code.equalsIgnoreCase("DD") || 
    code.equalsIgnoreCase("YY") || 
    code.equalsIgnoreCase("ZZ") || 
    code.equalsIgnoreCase("AX"); 

Если вы действительно хотите if заявления, то я бы определенно пойти с первым подходом. Он будет выполнять точно такое же количество сравнений, что и код if/else/if/else из-за короткого замыкания - если первый операнд оператора || оценивает значение true, тогда второй операнд не будет оцениваться ... но это лот прозрачный.

Другой альтернативой было бы создать фиксированный регистронезависимое набор, так что вы могли бы сказать:

return VALID_CODES.contains(code); 

Вы можете сделать это с TreeSet:

private static final Set<String> VALID_CODES = 
    new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); 

static { 
    VALID_CODES.add("AA"); 
    VALID_CODES.add("AB"); 
    VALID_CODES.add("SS"); 
    VALID_CODES.add("DD"); 
    VALID_CODES.add("YY"); 
    VALID_CODES.add("ZZ"); 
    VALID_CODES.add("AX"); 
} 
+1

Я бы сделал блок 'static' короче:' VALID_CODES.addAll (Array.sdll («AA», «AB», «SS», «DD», «YY», «ZZ», «AX "));' – Jesper

+1

@Jesper: Это был вариант, да. Жаль, что 'TreeSet' не принимает как сборник *, так и * компаратор в конструкторе, если честно :( –

1

Первый случай является способ go, как меньше код, он лучше с точки зрения удобочитаемости и обслуживания

На самом деле предложение Jon лучше всего, если вы просто хотите вернуть Boolean поскольку она включает в себя даже меньший код

1

в вашем случае я хотел бы использовать регулярное выражение:

return code.toUpperCase().matches("(AA|AB|SS|DD|ZZ|XX|CC)"); 
0

Массив со всеми этими строками и цикл, который проходит корыта и возвращается в первой истинной встречаемости будет еще больше поддерживаемый (и менее подробный).

0

В чем заключается возможность использования корпуса коммутатора? Это было бы лучше?

+0

Я забыл упомянуть, что в этом случае я использую Java 1.6, и я полагаю, что его невозможно выполните 'switch' на' String', если вы не используете 1.7+ - я верю, что это можно обойти с помощью 1.6 Enums и thw 'valueOf()' method –

0

Учитывая как наилучший, так и наихудший размер scemerios, оба ваших выбора будут одинаково эффективными, потому что в обоих случаях должно выполняться такое же количество сравнений ... но, как ответил jon, первый будет мало читаемым, чем второй...

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

0

Я бы с первым способом, как это более яснее и легче читать, чем второй, а также легко поддерживать и делать то же самое.

Кроме того, вы можете попробовать некоторые вещи даже лучше в производительности и легче читать - переключатель

Вот как то же самое, выше будет выглядеть так:

private static boolean isCodeSpecial(String code){ 
    switch(code.toUpperCase()){ //Convert code to upper case so that 
     case "AA":    //you don't have to do case sensitive search 
     case "AB": 
     case "SS": 
     case "DD": 
     case "YY": 
     case "ZZ": 
     case "AX": 
      return true; 
    } 
return false; 
} 

Дополнительное примечание:

Вы можете использовать только Switch в java для Строка на JDK 7 или более поздние версии. Если вы используете более раннюю версию java, тогда пойти, если еще версия.

Смежные вопросы