Java'da bir boole değişkenini değiştirmenin en temiz yolu?


211

Java'da bir boole'yi reddetmenin basit bir if-else'den daha iyi bir yolu var mı?

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

Ah güzel, aynı soruyu sormak üzereydim, her ne kadar benim sorum javascript / as3 ya da genel olarak ECMAScript'e özgü olurdu ...
matt lohkamp

Ya yoksa! Şebeke ??
onmyway133

Yanıtlar:


537
theBoolean = !theBoolean;

16
Bu ... gerçekten açık — ayy! Neden düşünmediğimi bilmiyorum. Teşekkürler.
Kevin Griffin

Boolean doğal bir seçim gibi görünüyor - belki gelecekte.
matt lohkamp

21
@ypnos: !!bool == !(!(bool)) == bool.
Christoffer Hammarström

12
@ ChristofferHammarström Bu mantıkla, --integer == - (- (integer)) == tam sayı olmamalı mı?
user515655

1
@ user515655 - Dil, bir --işleci tanımlar (aslında, ikisi, iki ++işleci ile birlikte ), ancak bir !!işleci tanımlamaz . İsterseniz -(-(integer))iki -karakter arasında beyaz boşluk kullanabilirsiniz . Ancak beyaz boşluktan bağımsız !!olarak iki !operatör olarak ayrışır .
Ted Hopp

164
theBoolean ^= true;

Değişkeniniz dört harften uzunsa daha az tuş vuruşu

Düzenle : kod, Google arama terimleri olarak kullanıldığında yararlı sonuçlar döndürme eğilimindedir. Yukarıdaki kod geçerli değildir. İhtiyaç duyanlar için, burada açıklandığı gibi XOR .


14
ve
KURU'ya

6
Öz olmak ince zekanın ruhudur.
Paul Brinkley

7
Şimdi programcı arkadaşlarımın önünde havalı görünmek için XOR'a açıkça isim-bırak (sözdizimi-bırakma?) alıyorum. Cevabınız seçilmiş olanla birleştirilmeli, birlikte saf mükemmellik.
matt lohkamp

6
@ScottStanchfield Böyle insanlar öğrenmelidir. Hiç de zor değil, hack değil ve bunu bilmemek, örneğin bu sorudaki gibi crappy koda yol açıyor. Bu gerçek bir patlama - standart kuralları kullanarak beş satır!
maaartinus

4
Bu işlem ayrıcatheBoolean = !theBoolean; veya gibi diğer sürümlere göre % 12 daha hızlıtheBoolean = theBoolean ? false : true;
Blaine Kasten

32

Bir kaç tane var

"Açık" yol (çoğu insan için)

theBoolean = !theBoolean;

"En kısa" yol (çoğu zaman)

theBoolean ^= true;

"En görsel" yol (en belirsiz)

theBoolean = theBoolean ? false : true;

Ekstra: Yöntem çağrısında geçiş yapma ve kullanma

theMethod( theBoolean ^= true );

Atama işleci her zaman atanmış olanı döndürdüğünden, bu değer bitsel işleç aracılığıyla değiştirilir ve sonra yöntem çağrısında kullanılacak yeni atanan değeri döndürür.


Uygulamayı aç / kapat olarak adlandırılan bir işleve / yönteme sarın ve sonra onu karıştırmanın neredeyse hiçbir yolu yoktur.
Lambage

@ Reiner: CKesinlikle, ama içinde Javaboolean ve tamsayı karıştırılmasına izin verilmez ( while(1)Java'da böyle şeyler de mümkün değildir).
Levite

@Lambage: Doğru, ama olumsuz olarak, bir boole'yi sadece geçerek değiştiremezsiniz, çünkü Java'da referanslarla ilkelleri iletmek mümkün değildir. Yöntemin sonucunu değişkeninize yeniden atamanız veya boolean için başka bir sarmalayıcı sınıfı oluşturmanız gerekir.
Levite

Yukarıdaki "bariz yol" SONAR tarafından şu şekilde işaretlenir - İç görevlerden kaçınılmalıdır.
Orby

2

Boolean NULL değerlerini kullanır ve bu değerleri yanlış görürseniz, şunu deneyin:

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

Boolean NULL değerlerini vermiyorsanız, şunu deneyin:

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

Bunlar en temiz olanıdır, çünkü yöntem imzasındaki niyeti gösterirler, okunması daha kolaydır ! operatör ve kolayca hata ayıklama.

kullanım

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

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

Tabii ki, Groovy veya uzantı yöntemlerine izin veren bir dil kullanıyorsanız, bir uzantı kaydedebilir ve şunları yapabilirsiniz:

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

İyi yaklaşım, ama tamamen açık değil (imho). Sadece "toggle (..)" kullanan / okuyan biri düşünebilir, yöntemi çağırmak (değişkeni yeniden atamadan) zaten temeldeki değişkeni değiştirebilir. Şu anda kodu görmek bizim için açıktır, ancak gerçek hayatta hata ayıklamak oldukça zor olabilir. Bunu daha açık hale getirmek için daha iyi bir yöntem adı "zıt" veya muhtemelen "olumsuzlama" olabilir; ya da ilk yaklaşımı bir nesneyle kullanın Booleanve gerçekten yöntem içinde değiştirin (ama yine de biraz belirsiz).
Levite

2

Bu cevap "java ters boolean işlevi" arandığında ortaya çıktı. Aşağıdaki örnek, bazı statik analiz araçlarının dallanma mantığı nedeniyle yapıların başarısız olmasını önleyecektir. Bir booleanı ters çevirmeniz ve kapsamlı birim testleri oluşturmadıysanız faydalıdır;)

Boolean.valueOf(aBool).equals(false)

Veya alternatif olarak:

Boolean.FALSE.equals(aBool)

veya

Boolean.FALSE::equals

1
Boolean.FALSE::equalsKüçük bir lambda yazmak yerine bir haritalama fonksiyonuna geçebilmeyi seviyorum
Patrick Parker

0

Özellikle profesyonel bir şey yapmıyorsanız, her zaman bir Util sınıfı kullanabilirsiniz. Ör. Sınıf için bir projeden bir util sınıfı.

public class Util {


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

}

o zaman sadece bir Util nesnesi oluşturun Util u = new Util(); ve geri dönüş için bir şey varSystem.out.println( u.flip(bool) );

Aynı şeyi tekrar tekrar kullanacaksanız, bir yöntem kullanın ve özellikle de projeler arasındaysa, bir Util sınıfı yapın. Ancak endüstri standardının ne olduğunu bilmiyorum. (Deneyimli programcılar beni düzeltmekten çekinmeyin)



-4

Önce:

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

Sonra:

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

Aşağıya kim oy verdi? Lütfen sebebini de açıklayabilir misiniz?
Nikhil Kumar

11
Birisinin sizi neden reddettiğini düşünebileceğim iki ana neden: 1) Konu büyücülük ( hadi! Soru 7 (!) Yıl önce soruldu! ) Ve cevabınız masaya yeni bir şey getirmiyor; 2) Seçmen "daha temiz" bir şey bekliyordu ( okundu: daha kısa ) - AaronMaenpaa'nın cevabı bunun en iyi örneğidir.
Priidu Neemre

5
@Elltz: Aksine - cevabın teknik olarak doğru olması nedeniyle onu gerçekten iptal ettim. Ancak, ucuz karma için önceki kullanıcının yanıtlarını önyükleme eğiliminden hoşlanmadığımı söylemeliyim (bkz. Nlaq'ın cevabı).
Priidu Neemre

@PriiduNeemre, soru sordu ve cevap 7+ yıl önce kabul edildi ve siz listeniz dışında herhangi birinin oy vereceğini düşünüyor musunuz? Bunun dışında cevabınız da işarete kadar değil .. :(
user1140237

2
after: boolean sonucu =! isresult ();
Petter Friberg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.