2013-11-21 8 views
6

Это может быть глупый вопрос, но мне интересно, возможно ли иметь оператор if, выполняющий все условия. Я объясняю:Если оператор, выполняющий все условия

if (methodA() && methodB() && methodC()) {code} 

code выполняется, когда все три метода возвращают истинный. Дело в том, что когда метод возвращает false, остальные методы не выполняются. Обычно это хорошо для производительности, но что, если мне действительно нужно выполнять все методы независимо от того, что они возвращают, и после этого оценивать выражение и переходить в if или нет. То же самое применяется для OR или любого другого.

Есть ли способ сказать, что Java ведет себя таким образом? Моя текущая работа заключается в том, чтобы разбить ее на три части, но это не всегда делает трюк и выглядит действительно уродливо.

+4

Да, если типы возвращаемого метода являются логическими. Затем используйте '&' вместо '&&'. '&&' означает, что первая из них является ложной остановкой, '&' будет продолжена независимо. –

+1

Вы также можете просто назначить результат своих методов в переменной и оценить эту переменную в своем состоянии. – benzonico

ответ

24

Это довольно просто: используйте оператор & вместо &&.

От: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.23

условного оператора и-& & подобен & (§15.22.2), но вычисляет правый операнд только, если значение его левого операнда является истинным.

+2

Вы можете объяснить разницу, пожалуйста? – MeNa

+0

wht использовать только &, но не && – Invader

+1

Посмотрите мой первый комментарий под вопросом «&& означает, что первый из них является ложным, он перестанет пытаться использовать следующие методы и будет продолжать использовать следующие методы независимо». –

9

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

if (methodA() & methodB() & methodC()) {code} 

Documentation

+0

+1 за упоминание «короткого замыкания». – SudoRahul

2

Вы должны использовать bitwise AND (&) оператор вместо logical AND (&&).

if (methodA() & methodB() & methodC()) {code} 

Подробнее читайте here.

2

Ваш точный ответ:

if (methodA() & methodB() & methodC()) {code} 
-2

Использование побитовое И вместо & &

if (methodA() & methodB() & methodC()) {code} 
2

попробовать этот

& is bitwise. && is logical. 

& evaluates both sides of the operation. 
&& evaluates the left side of the operation, if it's true, it continues and evaluates the right side. 

для быстрого использования исполнения & & если (мет Ода() & methodB() & methodC()) {код}

+0

в соответствии с кодом, который он опубликовал – Invader

+0

отредактировал код – Invader

0

Просто измените && на &. Поэтому ваш ответ

if (methodA() & methodB() & methodC()) {code} 

&& сравнение. Это означает, что инструкция if проверит сначала условие methodA() && methodB().Если это возвращает false, то methodC() не будет выполняться. Если значение true, то оно будет проверяться с помощью функции methodC().

& Поразрядный. Он вернет true, если все значение равно 1. methodA() & methodB() & methodC() считать как одно сравнение. Таким образом, он будет работать через всю функцию. И затем проверьте, является ли ответ истинным или ложным.

0

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

boolean resA = methodA(); 
boolean resB = methodB(); 
boolean resC = methodC(); 

затем сделать ваши IFS:

if (resA && resB && resC) { code } 

Таким образом, ваши методы будут работать, и вам просто нужно сравните то, что они вернули.

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