Найпростіший спосіб переключення булевої змінної на Java?


211

Чи є кращий спосіб заперечити булевий текст на Java, ніж простий інший спосіб?

if (theBoolean) {
    theBoolean = false;
} else {
    theBoolean = true;
}

о, приємно, я збирався задати те саме питання, хоча моє запитання було б специфічним для javascript / as3 або ECMAScript взагалі ... я думаю, що це питання охопить це питання.
matt lohkamp

Що робити, якщо немає! оператор ??
onmyway133

Відповіді:


537
theBoolean = !theBoolean;

16
Це ... дійсно очевидно - ой! Не знаю, чому я про це не думав. Дякую.
Кевін Гріффін

Булевий здається природним вибором - можливо, у майбутньому.
matt lohkamp

21
@ypnos : !!bool == !(!(bool)) == bool.
Крістофер Хаммарстрьом

12
@ ChristofferHammarström За цією логікою, то чи не слід --integer == - (- (ціле число)) == ціле число?
user515655

1
@ user515655 - Мова визначає --оператора (насправді два з них разом з двома ++операторами), але не визначає !!оператора. Якщо ви хочете, -(-(integer))ви можете використовувати пробіл між двома -символами. Але !!розбирає як два !оператори незалежно від пробілу.
Тед Хопп

164
theBoolean ^= true;

Менше натискань клавіш, якщо ваша змінна більше чотирьох літер

Редагувати : код, як правило, повертає корисні результати при використанні в якості пошукових термінів Google. Код, наведений вище, не відповідає. Для тих, хто цього потребує, це біт XOR, як описано тут .


14
і це відповідає DRY :)
Tetha

6
Стислість - це душа дотепності.
Пол Брінклі

7
тепер я дістаюсь до шаленого імені (drop-drop?) XOR, щоб виглядати круто перед своїми друзями-програмістами. Ваша відповідь повинна бути злита з обраною, разом вони є чистою досконалістю.
matt lohkamp

6
@ScottStanchfield Такі люди повинні це навчитися. Це зовсім не важко, це не хак, і не знаючи, що це часто призводить до шаленого коду, наприклад, до цього питання. Це справжній вибух - п’ять рядків із використанням стандартних умовностей!
maaartinus

4
Ця операція також на 12% швидша, ніж інші версії, наприклад, theBoolean = !theBoolean;абоtheBoolean = theBoolean ? false : true;
Blaine Kasten

32

Є кілька

"Очевидний" спосіб (для більшості людей)

theBoolean = !theBoolean;

"Найкоротший" спосіб (більшість часу)

theBoolean ^= true;

Найбільш візуальний спосіб (найбільш невизначено)

theBoolean = theBoolean ? false : true;

Додатково: перемикання та використання у виклику методу

theMethod( theBoolean ^= true );

Оскільки оператор призначення завжди повертає те, що було призначено, це перемикатиме значення через побітовий оператор, а потім повертає новопризначене значення, яке буде використано в виклику методу.


Оберніть реалізацію у функцію / метод, який називається toggle, і тоді майже неможливо переплутати її.
Lambage

@Reiner: Для певного періоду C, але в Javaньому заборонено змішувати булеві та цілі числа (також речі на зразок while(1)Java не можливі).
Левіт

@Lambage: Правда, але в зворотній стороні ви не можете перемикати булеве значення, просто передаючи його, оскільки неможливо передавати примітиви за посиланням на Java. Вам доведеться перепризначити результат методу вашій змінній або інакше створити клас обгортки для булева.
Левіт

Вище описаний "очевидний спосіб", за яким SONAR позначається - Внутрішні завдання повинні уникати.
Орбі

2

Якщо ви використовуєте булеві значення NULL і вважаєте їх помилковими, спробуйте:

static public boolean toggle(Boolean aBoolean) {
    if (aBoolean == null) return true;
    else return !aBoolean;
}

Якщо ви не передаєте булеві значення NULL, спробуйте:

static public boolean toggle(boolean aBoolean) {
   return !aBoolean;
}

Вони є найчистішими, оскільки вони показують наміри в підписі методу, їх легше читати порівняно з ! оператора, і його можна легко налагодити.

Використання

boolean bTrue = true
boolean bFalse = false
boolean bNull = null

toggle(bTrue) // == false
toggle(bFalse) // == true
toggle(bNull) // == true

Звичайно, якщо ви використовуєте Groovy або мову, яка дозволяє методи розширення, ви можете зареєструвати розширення і просто зробити:

Boolean b = false
b = b.toggle() // == true

Хороший підхід, але не зовсім однозначний (імхо). Для когось, хто використовує / читає просто "toggle (..)" може подумати, виклик методу (не привласнюючи його знову до змінної) може вже переключити нижчу змінну. Нам зараз очевидно, що ми бачимо код, але в реальному житті це може бути досить важко налагодити. Краще назва методу може бути "протилежним" або, можливо, "запереченням", щоб зробити це дещо більш очевидним; або використовувати перший підхід з об'єктом Booleanі дійсно перемикати його в межах методу (але все-таки дещо неоднозначно).
Левіт

2

Ця відповідь з'явилася під час пошуку "інвертувати булева функція java". Наведений нижче приклад запобігає виходу з ладу деяких інструментів статичного аналізу через логіку розгалуження. Це корисно, якщо вам потрібно інвертувати булеву формулу і не створили комплексні тести одиниць;)

Boolean.valueOf(aBool).equals(false)

або альтернативно:

Boolean.FALSE.equals(aBool)

або

Boolean.FALSE::equals

1
Мені подобається те, що ви могли перейти Boolean.FALSE::equalsдо функції картографування замість того, щоб написати трохи лямбда
Патрік Паркер

0

Якщо ти не робиш нічого особливо професійного, завжди можеш використовувати клас Util. Наприклад, клас утиліти з проекту для класу.

public class Util {


public Util() {}
public boolean flip(boolean bool) { return !bool; }
public void sop(String str) { System.out.println(str); }

}

тоді просто створіть об’єкт Util Util u = new Util(); і отримайте щось для поверненняSystem.out.println( u.flip(bool) );

Якщо ви все-таки будете використовувати одне і те ж саме, використовуйте метод, і особливо якщо це стосується проектів, складіть клас Util. Не знаю, що є галузевим стандартом. (Досвідчені програмісти можуть мене виправити)



-4

Перед:

boolean result = isresult();
if (result) {
    result = false;
} else {
    result = true;
}

Після:

boolean result = isresult();
result ^= true;

Хто коли-небудь проголосував? Чи можете ви пояснити, будь ласка, причину?
Нікхіл Кумар

11
Дві основні причини, які я можу подумати, чому хтось, можливо, вам прихилив: 1) некромантія теми ( давай! Запитання було задано 7 (!) Років тому! ), І ваша відповідь не приносить нічого нового на стіл; 2) Виборця очікували чогось «чистішого» ( читайте: коротше ) - відповідь АаронМенпаа - яскравий приклад цього.
Priidu Neemre

5
@Elltz: Навпаки - я фактично виступив проти нього, оскільки відповідь був технічно правильним. Однак я мушу сказати, що мені не подобається тенденція завантажувати відповіді попереднього користувача на дешеву карму (див. Відповідь nlaq).
Priidu Neemre

@PriiduNeemre, запитання та відповіді, прийняті до 7+ років, і ви думаєте, окрім вашого списку хтось відмовиться? окрім цього, ваша відповідь також не до позначки .. :(
user1140237

2
після: булевий результат =! isresult ();
Петтер Фріберг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.