2013-07-01 3 views
4

Скажем, я хочу, чтобы сравнить кучу переменных одной статической переменной, как правило, я хотел бы сделать это следующим образом:Лучший оператор DRY if?

int w = 0; 
int x = 1; 
int y = 1; 
int z = 2; 
if(w == x || w == y || w == z){/*more code here*/} 

Но что может получить очень долго и не представляется необходимым, есть ли способы что-то еще:

if(w == (x || y || z)){/*more code here*/} 

Я хотел бы думать, что есть способ сделать это так.

+0

Java не обеспечивает это изначально в своем синтаксисе. –

+0

@JimGarrison Не в чистом виде так или иначе – NullUserException

+3

Вы можете получить некоторое представление о http://stackoverflow.com/questions/7604814/best-way-to-format-multiple-or-conditions-in-an-if-statement- java – JHS

ответ

9

Вместо:

if(w == x || w == y || w == z) 

вы можете сделать:

+0

Это кажется намного лучше, спасибо. – Zachrip

+3

Но на несколько порядков медленнее. – EJP

+1

@EJP Вы знаете, что они говорят * Преждевременная оптимизация - это корень всех злых *, так как это не одно из узких мест приложения, я думаю, что это не должно быть важным фактором. –

0

Вы можете предпочесть отформатировать его, как это:

if(w == x || 
    w == y || 
    w == z) 

Я считаю, что это помогает разрушить условия и облегчает чтение.

+0

Это не то, что ищет ОП. Все, что вы сделали, переформатировано несколькими строками ... – Tdorno

3

Хотя есть ответ принят, я хотел бы поделиться своими способами тоже:

Метод 1 аналогичен принятым ответом. Однако вместо использования List я использую Set. В таком случае, это может быть даже быстрее, чем делать == индивидуально, если есть много значений, чтобы проверить против:

// make it a static final member if semantically possible 
Set<Integer> ALL_VALUES = new HashSet<Integer>(Arrays.asList(a,b,c,d,e,f,g,h)); 

//..... 

if (ALL_VALUES.contains(w)) { 
    //... do something 
} 

Метод 2, чтобы написать маленькую функцию полезности, что-то вроде

public static <T> boolean sameAsAny(T value, T... possibleValues) { 
    for (T p : possibleValues) { 
    if (value == p) { 
     return true; 
    } 
    } 
    return false; 
} 

с такой вы можете сделать что-то вроде:

if (sameAsAny(w, x, y, z)) 
0

Это не разрешено на Java. Но вы можете изучить некоторые основанные на правилах двигатели, например drools.

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