Cara terbersih untuk beralih variabel boolean di Jawa?

211

Apakah ada cara yang lebih baik untuk meniadakan boolean di Jawa daripada yang sederhana?

if (theBoolean) {
    theBoolean = false;
} else {
    theBoolean = true;
}
Kevin Griffin
sumber
oh bagus, saya akan mengajukan pertanyaan yang sama, meskipun pertanyaan saya sudah spesifik untuk javascript / as3, atau ECMAScript secara umum saya kira ... yang dengan mudah akan dibahas oleh pertanyaan ini.
matt lohkamp
Bagaimana jika tidak ada! operator ??
onmyway133

Jawaban:

537
theBoolean = !theBoolean;
Aaron Maenpaa
sumber
16
Itu ... sangat jelas — oops! Tidak tahu mengapa saya tidak memikirkannya. Terima kasih.
Kevin Griffin
Boolean sepertinya pilihan alami - mungkin di masa depan.
matt lohkamp
21
@ypnos: !!bool == !(!(bool)) == bool.
Christoffer Hammarström
12
@ ChristofferHammarström Dengan logika itu, maka seharusnya tidak --integer == - (- (integer)) == integer?
user515655
1
@ user515655 - Bahasa mendefinisikan --operator (sebenarnya, dua dari mereka, bersama dengan dua ++operator), tetapi tidak mendefinisikan !!operator. Jika mau, -(-(integer))Anda dapat menggunakan ruang putih di antara dua -karakter. Tetapi !!diurai sebagai dua !operator terlepas dari ruang putih.
Ted Hopp
164
theBoolean ^= true;

Lebih sedikit penekanan jika variabel Anda lebih panjang dari empat huruf

Sunting : kode cenderung memberikan hasil yang bermanfaat ketika digunakan sebagai istilah pencarian Google. Kode di atas tidak. Bagi mereka yang membutuhkannya, itu XOR bitwise seperti yang dijelaskan di sini .

pateksan
sumber
14
dan itu sesuai dengan KERING :)
Tetha
6
Keringkasan adalah jiwa kecerdasan.
Paul Brinkley
7
sekarang saya bisa dengan mudahnya memberi nama-drop (sintaks-drop?) XOR agar terlihat keren di depan teman-teman programmer saya. Jawaban Anda harus digabung dengan yang dipilih, bersama-sama mereka murni kesempurnaan.
matt lohkamp
6
@ScottStanchfield Orang-orang seperti itu harus mempelajarinya. Tidak sulit sama sekali, tidak ada peretasan, dan tidak mengetahuinya sering menyebabkan kode jelek seperti misalnya satu pertanyaan ini. Ini adalah ledakan nyata - lima baris menggunakan konvensi standar!
maaartinus
4
Operasi ini juga 12% lebih cepat daripada versi lain seperti theBoolean = !theBoolean;atautheBoolean = theBoolean ? false : true;
Blaine Kasten
32

Ada beberapa

Cara "jelas" (bagi kebanyakan orang)

theBoolean = !theBoolean;

Cara "terpendek" (sebagian besar waktu)

theBoolean ^= true;

Cara "paling visual" (paling tidak pasti)

theBoolean = theBoolean ? false : true;

Ekstra: Beralih dan digunakan dalam pemanggilan metode

theMethod( theBoolean ^= true );

Karena operator penugasan selalu mengembalikan apa yang telah ditetapkan, ini akan beralih nilai melalui operator bitwise, dan kemudian mengembalikan nilai yang baru ditugaskan untuk digunakan dalam pemanggilan metode.

Orang Lewi
sumber
Bungkus implementasi dalam fungsi / metode yang disebut toggle dan kemudian hampir tidak ada cara untuk membingungkannya.
Lambage
@ Reiner: Untuk yang Cpasti, tetapi di Javadalamnya tidak diizinkan untuk mencampur boolean dan integer (juga hal-hal seperti while(1)tidak mungkin di Jawa).
Levite
@Lambage: Benar, tetapi pada sisi negatifnya Anda tidak dapat beralih boolean hanya dengan melewatkannya, karena tidak mungkin untuk melewati primitif dengan referensi di Jawa. Anda harus menugaskan kembali hasil metode ke variabel Anda, atau membuat kelas pembungkus untuk boolean.
Levite
"Cara yang jelas" di atas ditandai oleh SONAR dengan - Tugas dalam harus dihindari.
Orby
2

Jika Anda menggunakan nilai Boolean NULL dan menganggapnya salah, coba ini:

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

Jika Anda tidak memberikan nilai Boolean NULL, coba ini:

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

Ini adalah yang terbersih karena mereka menunjukkan maksud dalam metode tanda tangan, lebih mudah dibaca dibandingkan dengan ! operator, dan dapat dengan mudah didebug.

Pemakaian

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

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

Tentu saja, jika Anda menggunakan Groovy atau bahasa yang memungkinkan metode ekstensi, Anda dapat mendaftarkan ekstensi dan cukup lakukan:

Boolean b = false
b = b.toggle() // == true
Steven Spungin
sumber
Pendekatan yang baik, tetapi tidak sepenuhnya ambigu (imho). Untuk seseorang yang menggunakan / membaca hanya "toggle (..)" mungkin berpikir, memanggil metode (tanpa menetapkannya lagi ke variabel) mungkin sudah beralih variabel yang mendasarinya. Jelas bagi kami saat ini melihat kode, tetapi dalam kehidupan nyata mungkin cukup sulit untuk debug. Nama metode yang lebih baik mungkin "berlawanan" atau mungkin "negasi", untuk membuatnya lebih jelas; atau gunakan pendekatan pertama dengan objek Booleandan benar-benar beralih dalam metode (tetapi masih agak ambigu).
Levite
2

Jawaban ini muncul ketika mencari "fungsi java invert boolean". Contoh di bawah ini akan mencegah alat analisis statis tertentu gagal membangun karena logika percabangan. Ini berguna jika Anda perlu membalikkan boolean dan belum membangun unit test yang komprehensif;)

Boolean.valueOf(aBool).equals(false)

atau sebagai alternatif:

Boolean.FALSE.equals(aBool)

atau

Boolean.FALSE::equals
Parameter Dokter
sumber
1
Saya suka fakta bahwa Anda dapat beralih Boolean.FALSE::equalske fungsi pemetaan alih-alih menulis lambda kecil
Patrick Parker
0

Jika Anda tidak melakukan sesuatu yang sangat profesional, Anda selalu dapat menggunakan kelas Util. Mis, kelas util dari proyek untuk kelas.

public class Util {


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

}

kemudian hanya membuat objek Util Util u = new Util(); dan punya sesuatu untuk kembaliSystem.out.println( u.flip(bool) );

Jika Anda akan berakhir menggunakan hal yang sama berulang-ulang, gunakan metode, dan terutama jika itu lintas proyek, buat kelas Util. Entah apa standar industri. (Pemrogram berpengalaman merasa bebas untuk memperbaiki saya)

Will D.
sumber
-4

Sebelum:

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

Setelah:

boolean result = isresult();
result ^= true;
Nikhil Kumar
sumber
Siapa yang pernah memilih? Bisakah Anda jelaskan alasannya juga?
Nikhil Kumar
11
Dua alasan utama yang dapat saya pikirkan mengapa seseorang mungkin menurunkan Anda: 1) Thread necromancy ( ayolah! Pertanyaannya diajukan 7 (!) Tahun yang lalu! ) & Jawaban Anda tidak membawa sesuatu yang baru ke meja; 2) Pemilih mengharapkan sesuatu yang "bersih" ( baca: lebih pendek ) - Jawaban AaronMaenpaa adalah contoh utama dari ini.
Priidu Neemre
5
@ Elltz: Sebaliknya - saya benar-benar telah mengangkatnya, karena secara teknis jawabannya benar. Namun, saya harus mengatakan bahwa saya tidak menikmati tren pembajakan balasan pengguna sebelumnya untuk karma murah (lihat jawaban nlaq).
Priidu Neemre
@PriiduNeemre, pertanyaan yang diajukan & jawaban diterima sebelum 7+ tahun & apakah Anda pikir kecuali dari daftar siapa pun yang akan memberikan suara positif? Terlepas dari ini, jawaban Anda juga tidak sesuai dengan sasaran .. :(
user1140237
2
setelah: boolean result =! isresult ();
Petter Friberg