Javaでブール変数を切り替える最もクリーンな方法は?


211

単純なif-elseよりもJavaでブール値を否定するより良い方法はありますか?

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

私の質問はjavascript / as3またはECMAScript全般に固有のものでしたが、同じ質問をしようとしていましたが、この質問で簡単にカバーできます。
matt lohkamp 2009年

ない場合はどうでしょう!演算子??
onmyway133 2014

回答:


537
theBoolean = !theBoolean;

16
それは...本当に明白です-おっと!どうして考えなかったのかわからない。ありがとう。
ケビングリフィン、

!ブール値は自然な選択のようです-おそらく将来的に。
matt lohkamp 2009年

21
@ypnos: !!bool == !(!(bool)) == bool
ChristofferHammarström11年

12
@ChristofferHammarströmそのロジックによって、それから--integer ==-(-(integer))== integer?
user515655

1
@ user515655-言語は--演算子(実際には2つの++演算子とともに2つ)を定義しますが、!!演算子は定義しません。必要な場合-(-(integer))は、2つの-文字の間に空白を使用できます。ただし、空白に関係なく、!!2つの!演算子として解析されます。
Ted Hopp 2017年

164
theBoolean ^= true;

変数が4文字より長い場合、キーストロークが少なくなります

編集:Google検索用語として使用すると、コードは有用な結果を返す傾向があります。上記のコードはそうではありません。それを必要とする人のために、それはだビット単位のXORとしてここで説明します


14
そしてそれはDRYに準拠します:)
Tetha

6
簡潔さはウィットの魂です。
ポールブリンクリー

7
プログラマーの友達の前でかっこよく名前ドロップ(構文ドロップ?)XORできるようになりました。あなたの答えは、選択されたものとマージされるべきです、それらは一緒に純粋な完璧です。
matt lohkamp、2009年

6
@ScottStanchfieldそのような人々はそれを学ぶべきです。それはまったく難しいことではなく、ハックでもありません。また、それを知らないことは、たとえばこの質問のように、くだらないコードにつながることがよくあります。これは本当の爆破です-標準的な規則を使用した5行です!
maaartinus 14年

4
この操作は、また、12%高速であるような他のバージョンよりもtheBoolean = !theBoolean;theBoolean = theBoolean ? false : true;
ブレインカステン

32

いくつかあります

「明白な」方法(ほとんどの人にとって)

theBoolean = !theBoolean;

「最短」の方法(ほとんどの場合)

theBoolean ^= true;

「最も視覚的な」方法(ほとんど不確実)

theBoolean = theBoolean ? false : true;

追加:メソッド呼び出しで切り替えて使用する

theMethod( theBoolean ^= true );

割り当て演算子は常に割り当てられたものを返すので、これはビット演算子を介して値を切り替え、次にメソッド呼び出しで使用される新しく割り当てられた値を返します。


トグルと呼ばれる関数/メソッドで実装をラップします。それを混同する方法はほとんどありません。
Lambage 2017

@Reiner:C間違いなくですが、Javaブール値と整数を混在させることはできません(while(1)Javaでは不可能など)。
Levite、

@Lambage:真ですが、Javaで参照によってプリミティブを渡すことができないため、欠点としては、単にブール値を渡すだけでは切り替えられません。メソッドの結果を変数に再割り当てするか、ブール値のラッパークラスを作成する必要があります。
Levite、

上記の「明白な方法」はSONARによってフラグが付けられます-内部割り当ては避けてください。
Orby

2

ブールNULL値を使用し、それらをfalseと見なす場合は、次のことを試してください。

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

良いアプローチですが、完全に明確ではありません(imho)。「toggle(..)」だけを使用/読み取る人にとっては、(変数に再度割り当てることなく)メソッドを呼び出すと、基になる変数が既に切り替えられている可能性があります。現在コードを見ているのは明らかですが、実際にはデバッグが非常に難しい場合があります。よりわかりやすいメソッド名としては、「反対」または「否定」の可能性があります。または、オブジェクトで最初のアプローチを使用し、Booleanそれをメソッド内で実際に切り替えます(ただし、多少あいまいです)。
レビット

2

この答えは、「java invert boolean function」を検索したときに出ました。以下の例は、特定の静的分析ツールが分岐ロジックのためにビルドに失敗するのを防ぎます。これは、ブール値を反転する必要があり、包括的な単体テストを構築していない場合に便利です;)

Boolean.valueOf(aBool).equals(false)

または代わりに:

Boolean.FALSE.equals(aBool)

または

Boolean.FALSE::equals

1
Boolean.FALSE::equals少しラムダを書く代わりにマッピング関数に渡せるという事実が気に入っています
Patrick Parker

0

特に専門的なことを何もしていない場合は、常にUtilクラスを使用できます。例:クラスのプロジェクトからの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;

誰が反対票を投じたことがありますか?理由も教えてください。
Nikhil Kumar 2015

11
私は、誰かがあなたをdownvotedたかもしれない理由を考えることができる2つの主な理由:1)スレッド死霊術(数年前に来ての質問は(7を頼まれた!)! )&あなたの答えは、テーブルに新しい何かをもたらすことはありません。2)有権者は「よりクリーン」なものを期待していました(読む:より短い)-AaronMaenpaaの回答はこの典型的な例です。
Priidu Neemre 2015

5
@エルツ:それどころか、返事は技術的に正しかったので、私は実際に彼に賛成票を投じました。ただし、安いカルマに対する以前のユーザーの返信を偽造する傾向を楽しんでいないと言わざるを得ません(nlaqの回答を参照)。
Priidu Neemre

@ PriiduNeemre、7年以上前に質問と回答が受け入れられました。あなたのリスト以外では、誰かが賛成票を投じると思いますか?これとは別に、あなたの答えもマークまでではありません.. :(
user1140237

2
後:ブール結果=!isresult();
Petter Friberg、2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.