Jawaban:
Dari Spesifikasi Bahasa Jawa - 15.26.2 Operator Penugasan Majemuk .
Ekspresi penugasan majemuk bentuk
E1 op= E2setara denganE1 = (T)((E1) op (E2)), di manaTjenisE1, kecuali yangE1dievaluasi hanya sekali.
Jadi a &= b;setara dengan a = a & b;.
(Dalam beberapa penggunaan, tipe-casting membuat perbedaan pada hasilnya, tetapi dalam tipe ini bharus booleandan tipe-cast tidak melakukan apa-apa.)
Dan, sebagai catatan, a &&= b;Java tidak valid. Tidak ada &&=operator.
Dalam praktiknya, ada sedikit perbedaan semantik antara a = a & b;dan a = a && b;. (Jika bvariabel atau konstanta, hasilnya akan sama untuk kedua versi. Hanya ada perbedaan semantik ketika bsubekspresi yang memiliki efek samping. Dalam &kasus ini, efek samping selalu terjadi. Dalam &&hal itu terjadi tergantung pada nilaia .)
Di sisi kinerja, trade-off adalah antara biaya evaluasi b, dan biaya tes dan cabang dari nilai a, dan potensi penghematan dari menghindari penugasan yang tidak perlu a. Analisisnya tidak langsung, tetapi kecuali biaya penghitungannya btidak sepele, perbedaan kinerja antara kedua versi terlalu kecil untuk dipertimbangkan.
lihat 15.22.2 JLS . Untuk operan boolean, &operator adalah boolean, bukan bitwise. Satu-satunya perbedaan antara &&dan &untuk operan boolean adalah untuk&& pendek (artinya operan kedua tidak dievaluasi jika operan pertama bernilai false).
Jadi dalam kasus Anda, jika badalah primitif, a = a && b, a = a & b, dan a &= bsemua melakukan hal yang sama.
Yang terakhir:
a = a & b;
Berikut cara sederhana untuk mengujinya:
public class OperatorTest {
public static void main(String[] args) {
boolean a = false;
a &= b();
}
private static boolean b() {
System.out.println("b() was called");
return true;
}
}
Keluarannya b() was called, oleh karena itu operan tangan kanan dievaluasi.
Jadi, seperti yang sudah disebutkan oleh orang lain, a &= bsama dengan a = a & b.
saya menemukan situasi yang sama menggunakan boolean di mana saya ingin menghindari memanggil b () jika sudah salah.
Ini bekerja untuk saya:
a &= a && b()
a=a&&b().