Kapan pernyataan nol digunakan di Jawa?

10

Dalam sebuah buku teks yang telah saya cari kelasnya, dinyatakan, sebuah pernyataan bisa kosong (pernyataan nol). Pernyataan nol didefinisikan hanya sebagai tanda titik koma.

Sama sekali tidak melakukan apa pun pada waktu eksekusi. Pernyataan nol jarang digunakan.

Sebagai seorang programmer yang cukup berpengalaman, saya merasa menarik bahwa mereka mengatakan jarang digunakan, apakah ini menyiratkan bahwa di suatu tempat, ada gunanya.

Apa yang bisa menjadi penggunaan pernyataan seperti itu?

Bassinator
sumber

Jawaban:

7

Sebagian besar tidak berguna, tetapi ada beberapa tempat di mana itu perlu. Sebagai contoh:

while (DoSomething());

Ini mengeksekusi DoSomething()metode sampai mengembalikan false. Jelas ini mengasumsikan metode ini juga melakukan beberapa efek samping yang bermanfaat. Tetapi pernyataan kosong, yaitu tanda titik koma, diperlukan, jika tidak, while-loop akan menyertakan pernyataan berikut selanjutnya.

(Tapi bertentangan dengan jawaban yang lain, for(;;) {}adalah tidak contoh laporan kosong, karena kurung setelah untuk klausa tidak mengandung pernyataan, itu hanya menggunakan titik koma untuk memisahkan (opsional) ekspresi. Lihat tata bahasa Jawa untuk rincian.)

JacquesB
sumber
3
+1 - ini adalah satu-satunya saat saya melihatnya benar-benar digunakan (seperti yang dinyatakan, bagian kosong dari pernyataan 'untuk' sedikit berbeda). Satu-satunya perubahan yang saya buat adalah menunjukkan bahwa jauh membingungkan untuk membaca penggunaan seperti ini jika pernyataan nol dibiarkan pada barisnya sendiri, daripada segera setelah loop sementara, di mana ia hanya terlihat seperti pernyataan biasa terminator ...
Jules
12

Anda dapat menggunakannya saat pernyataan secara sintaksis diperlukan tetapi tidak secara semantik diperlukan. Kasus yang paling umum adalah menghilangkan salah satu bagian dari for for, seperti contoh ini , meskipun kebanyakan orang merasa penggunaan itu aneh dan sulit dibaca. Seperti yang dikatakan buku Anda, ini jarang digunakan.

Karl Bielefeldt
sumber
Bahwa. Merupakan fitur bahasa yang tidak berguna. Saya lebih suka dipaksa untuk secara eksplisit membaca duplikasi daripada harus ke Google "hanya java titik koma".
Chris Cirefice
2
@ ChrisCirefice Di sisi lain "hanya titik koma: cukup jelas apa yang harus dilakukan mengingat Anda tahu bahasa secara moderat. Ini bukan aturan yang terpisah, itu hanya konsekuensi dari aturan lain. Ditambah jika Anda mempelajarinya setelah Anda mengetahuinya selamanya, jadi saya akan mengatakan itu tidak benar-benar masalah
Maurycy
1
Jika Anda merasa menulis lingkaran seperti itu, Anda melakukan kesalahan.
Bassinator
Saya memiliki metode polling tidur yang saya gunakan untuk memeriksa kapan perangkat kembali online. Kode ini terlihat seperti ini:, while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }semua pada baris yang berbeda, tentu saja. Saya bisa saja menulisnya while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }, tapi itu salah.
BobDalgleish
Itu bukan pernyataan nol apa yang kita gunakan juga untuk memaksa keluar dari metode 'void'? void method(){ //code here. If(condition){return ;}}.
Laiv
9

Saya lebih suka menggunakan loop sementara , tetapi ekspresi nol memungkinkan Anda menulis ini:

for (;;) { thread.run(); }

Namun, pernyataan nol memungkinkan Anda menulis ini:

while(true);
{
    thread.run();
}

Tujuan utamanya adalah membuang-buang waktu programmer pemeliharaan yang buruk yang datang setelah Anda dan bertanya-tanya mengapa utas tidak berjalan. Pernyataan harus mengikuti beberapa saat. Seorang diri; adalah sebuah pernyataan. Jadi blok pernyataan ini sebenarnya bukan bagian dari loop.

Itu tidak berarti tidak ada gunanya. Mereka jarang. Mereka biasanya terlihat seperti ini:

{
    ;
}

Karena dengan cara ini sepertinya Anda bermaksud melakukan itu (bahkan ini terkadang tidak cukup).

Dalam perakitan pernyataan nol ini disebut NOP . Dalam Python disebut pass . Dalam java (dan anak-anak lain dari c) itu adalah titik koma seperti yang Anda katakan, atau bahkan menyatakan benar;

Saya tahu beberapa kegunaan:

Semantik .

Ada perbedaan antara ruang kosong dan meletakkan nol di bawah sebagai jawaban. Jelas dikatakan, tidak, saya tidak lupa untuk meletakkan sesuatu di sini. Tidak ada yang dimaksudkan sebagai apa-apa. Tidak ada yang eksplisit. Ruang ini sengaja dikosongkan. Ini adalah bagaimana kami mendapatkan N / A untuk dikompilasi.

Pola nol

Bayangkan sebuah mesin pemberi sinyal cahaya yang rumit dan mahal yang berulang kali mengambil bola lampu berwarna dari sabuk konveyor, memasukkannya ke dalam soket, menyalakannya, melepasnya, dan mengambil yang berikutnya. Anda dapat mengontrol apa yang ditandai oleh warna lampu yang Anda pasang di sabuk. Hebat, sekarang akhirnya bekerja dengan sempurna, atasan Anda ingin Anda menciptakan cara untuk mengontrol waktu sinyal-sinyal ini. Dia ingin menambahkan celah di antara pesan-pesan. Anda ingat dengan ngeri bahwa banyak bagian peduli tentang waktu sinyal-sinyal ini dan betapa menyebalkannya untuk menyinkronkannya. Bagaimana Anda akan mengendalikan waktu tanpa ini membuat Anda bekerja selama akhir pekan? Anda melihat ke tempat sampah yang terbakar dan mendapatkan ide yang cemerlang.

Terkadang Anda ingin menggunakan polimorfisme untuk mematikan sesuatu tanpa merusak apa pun.

Debugging

Ketika Anda menetapkan breakpoint, Anda perlu ada tempat untuk breakpoint. Sekarang yakin beberapa debugger akan membiarkan Anda mengaturnya pada kurung kurawal penutupan tetapi jika mereka tidak senang bahasanya memungkinkan Anda memaksa ada tempat untuk meletakkan satu bahkan jika tempat itu tidak melakukan apa-apa.

Bukan benar-benar java tetapi ada juga:

Mengotak-atik biner

Instruksi Assemblies NOP memungkinkan mengutak-atik file biner yang dapat dieksekusi. Tapi kompiler java modern mengoptimalkan begitu jauh saya tidak yakin titik koma tidak hanya pergi poof. Tetapi di masa lalu kita juga menggunakan titik-titik kosong ini di executable untuk mengontrol waktu atau memungkinkan kita untuk menyerah. Tanpa NOP akan ada instruksi yang sebenarnya di sana, jadi jika Anda ingin menghubungkan Anda harus menyalin petunjuk itu di tempat lain untuk memberikan ruang bagi kait. Ini berfungsi dengan baik dalam bahasa c dari mana Java mendapatkan banyak sintaksisnya. Tapi saya tidak berpikir pengait ini banyak terjadi di Jawa. Kami menggunakan Pemrograman Berorientasi Aspek untuk melakukan itu.

candied_orange
sumber
2
Ini mungkin kelihatan luar biasa, tetapi contoh dengan forbukan pernyataan nol. Pernyataan kosong (alias pernyataan kosong) dapat terjadi di tempat yang sama dengan pernyataan lain (seperti an if) dapat terjadi, tetapi tanda kurung berikut forini tidak mengizinkan pernyataan di antara titik koma, tetapi hanya inisialisasi dan dua ekspresi, yang merupakan opsional. Jadi itu adalah penggunaan yang berbeda dari titik koma sebagai terminator-terminator. Pernyataan kosong akan menjadi titik koma terakhir difor(;;);
JacquesB
Anda benar, ini kelihatannya luar biasa: P. Baik, harap perhatikan edit saya.
candied_orange
-7

Saya menggunakannya karena Java dirancang sedemikian rupa sehingga tidak kongruen dengan bahasa manusia. Hal yang sama berlaku untuk C.

Pernyataan adalah statement;.

Pernyataan if-then-else adalah if (condition) statement; else statement;

Pernyataan if-then-else dengan blok majemuk adalah if (condition) {statements} else {statements}

Ini jelas omong kosong.

Saya menulis if (condition) {statements} else {statements};yang logis dan masuk akal.

Jika desainer Jawa ingin memperlakukan ini seolah-olah-lain diikuti oleh pernyataan nol, saya setuju dengan itu. Jika itu membuat mereka bahagia, biarkan itu membuat mereka bahagia.

Martin Kochanski
sumber
Ini if (condition) {statements;} else {statements;}. Juga, Java cukup konsisten tentang tidak perlu ;setelah }. Seperti bagaimana bahasa manusia tidak sering menempel pada akhir kalimat yang sudah diakhiri dengan tanda tanya. (Tentu, ada akhir !?atau ?!akhir, tapi itu hanya perkiraan , karakter interrobang .)
8bittree
1
Tuhan yang manis !! o_O
Áxel Costas Pena