เมื่อใดที่จะใช้คำสั่ง null ใน Java


10

ในหนังสือเรียนที่ฉันกำลังมองหาชั้นเรียนมีการระบุคำสั่งสามารถว่างเปล่า (คำสั่งโมฆะ) คำสั่ง null ถูกกำหนดเป็นเซมิโคลอน

มันไม่ทำอะไรเลยในเวลาดำเนินการ คำสั่ง null ใช้ไม่ค่อย

ในฐานะโปรแกรมเมอร์ที่มีประสบการณ์ในระดับปานกลางฉันพบว่ามันน่าสนใจที่พวกเขาพูดว่าไม่ค่อยได้ใช้นี่เป็นนัยที่บางแห่งมีประโยชน์สำหรับมัน

สิ่งที่อาจเป็นการใช้คำสั่งดังกล่าวหรือไม่

คำตอบ:


7

ส่วนใหญ่จะไร้ประโยชน์ แต่มีบางสถานที่ที่จำเป็น ตัวอย่างเช่น:

while (DoSomething());

วิธีนี้จะดำเนินการDoSomething()วิธีการจนกว่ามันจะส่งกลับเท็จ เห็นได้ชัดว่าสิ่งนี้ถือว่าวิธีนี้ยังมีผลข้างเคียงที่เป็นประโยชน์ แต่จำเป็นต้องใช้คำสั่งที่ว่างเปล่าเช่นเครื่องหมายอัฒภาคต่อท้ายมิฉะนั้นขณะที่ลูปจะรวมคำสั่งต่อไปนี้แทน

( แต่จะขัดแย้งกับคำตอบอื่น ๆfor(;;) {}คือไม่ได้ตัวอย่างของงบที่ว่างเปล่าให้ตั้งแต่วงเล็บหลังสำหรับข้อไม่ได้มีงบก็แค่ใช้อัฒภาคเพื่อแยก (อุปกรณ์เสริม) การแสดงออก. ดูไวยากรณ์ Javaสำหรับรายละเอียด.)


3
+1 - นี่เป็นครั้งเดียวที่ฉันเคยเห็นมันใช้จริง ๆ (ตามที่ระบุส่วนที่ว่างของคำสั่ง 'for' จะแตกต่างกันเล็กน้อย) การเปลี่ยนแปลงเพียงอย่างเดียวที่ฉันทำคือการชี้ให้เห็นว่ามันเป็นเรื่องที่ไกลเกินกว่าจะทำให้เกิดความสับสนในการอ่านการใช้งานแบบนี้หากคำสั่งโมฆะถูกปล่อยไว้บนบรรทัดของมันเองแทนที่จะเป็นทันทีหลังจากในขณะที่ลูป เทอร์มิ ...
จูลส์

12

คุณสามารถใช้มันได้เมื่อต้องการคำสั่งทางไวยากรณ์ แต่ไม่จำเป็นต้องใช้ความหมาย กรณีที่พบบ่อยที่สุดคือการละเว้นส่วนใดส่วนหนึ่งของ for for loop เช่นตัวอย่างนี้แม้ว่าคนส่วนใหญ่จะพบว่าการใช้งานนั้นแปลกและอ่านยาก เหมือนที่หนังสือของคุณบอกว่ามันไม่ค่อยได้ใช้


ที่. เป็นคุณสมบัติทางภาษาที่ไร้ประโยชน์ ฉันอยากถูกบังคับให้อ่านข้อความซ้ำซ้อนอย่างชัดเจนมากกว่าต้องใช้ Google "เฉพาะเซมิโคลอน java"
Chris Cirefice

2
@ChrisCirefice ในทางกลับกัน "เพียงแค่อัฒภาค: ค่อนข้างชัดเจนว่ามันควรทำอย่างไรเมื่อพิจารณาว่าคุณรู้ภาษาในระดับปานกลางมันไม่ใช่กฎแยกต่างหากมันเป็นเพียงผลของกฎอื่น ๆ และถ้าคุณเรียนรู้เมื่อคุณรู้จักมันตลอดไป ดังนั้นฉันจะบอกว่ามันไม่มีปัญหาใด ๆ จริงๆ
Maurycy

1
ถ้าคุณรู้สึกว่าคุณกำลังเขียนลูปแบบนี้คุณกำลังทำอะไรผิดไป
Bassinator

ฉันมีวิธีการนอนหลับสำรวจที่ฉันใช้เพื่อตรวจสอบว่าอุปกรณ์กลับมาออนไลน์ แน่นอนว่าโค้ดมีลักษณะดังนี้: while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }ทุกบรรทัดแยกกันแน่นอน ฉันสามารถเขียนมันเป็นwhile ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }แต่จะผิด
BobDalgleish

มันไม่ใช่คำสั่ง null ที่เราใช้เพื่อบังคับให้ออกจากวิธีการ 'โมฆะ'? void method(){ //code here. If(condition){return ;}}.
Laiv

9

ฉันชอบใช้การวนรอบสักครู่แต่นิพจน์เป็นโมฆะช่วยให้คุณเขียนนี้

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

อย่างไรก็ตามคำสั่ง null ให้คุณเขียนสิ่งนี้:

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

วัตถุประสงค์หลักคือการเสียเวลาของโปรแกรมเมอร์บำรุงรักษาที่ไม่ดีซึ่งมาหลังจากคุณและสงสัยว่าทำไมเธรดไม่ทำงาน คำสั่งจะต้องปฏิบัติตามในขณะ โดดเดี่ยว เป็นคำสั่ง ดังนั้นบล็อกคำสั่งนี้ไม่ได้เป็นส่วนหนึ่งของลูป

ไม่ได้หมายความว่าจะไม่มีประโยชน์อะไร พวกมันแค่หายาก พวกเขามักจะมีลักษณะเช่นนี้:

{
    ;
}

เพราะวิธีนี้ดูเหมือนว่าคุณตั้งใจจะทำเช่นนั้น (บางครั้งก็ไม่พอ)

ในการประกอบงบ null นี้เรียกว่าNOP ในหลามก็เรียกว่าผ่าน ใน java (และลูก ๆ ของ c) มันคือเครื่องหมายอัฒภาคตามที่คุณพูดหรือแม้แต่ยืนยันความจริง

ฉันรู้ของใช้ไม่กี่:

ความหมาย

มีความแตกต่างระหว่างพื้นที่ว่างกับการวางศูนย์ลงเป็นคำตอบ มันบอกอย่างชัดเจนว่าไม่ฉันไม่ลืมที่จะใส่อะไรที่นี่ สิ่งนี้ไม่ได้มีไว้เพื่ออะไร ไม่มีอะไรชัดเจน พื้นที่นี้เว้นว่างโดยเจตนา นี่คือวิธีที่เราได้รับ N / A เพื่อรวบรวม

รูปแบบ null

ลองนึกภาพเครื่องส่งสัญญาณแสงที่มีความซับซ้อนและมีราคาแพงซึ่งหยิบหลอดไฟสีขึ้นมาซ้ำ ๆ จากสายพานลำเลียงแล้วขันเข้ากับซ็อกเก็ตเปิดเครื่องถอดและถอดหลอดถัดไป คุณสามารถควบคุมสิ่งที่สิ่งนี้ส่งสัญญาณโดยสีของหลอดไฟที่คุณใส่บนสายพาน เยี่ยมมากตอนนี้ในที่สุดมันก็ทำงานได้อย่างไร้ที่ติเจ้านายของคุณต้องการให้คุณสร้างวิธีควบคุมเวลาของสัญญาณเหล่านี้ เขาต้องการเพิ่มช่องว่างระหว่างข้อความ คุณจำได้ด้วยความสยองขวัญที่หลายส่วนสนใจเกี่ยวกับจังหวะเวลาของสัญญาณเหล่านี้และมันเจ็บปวดแค่ไหนที่จะทำให้มันตรงกัน คุณจะควบคุมเวลาโดยไม่ทำให้คุณทำงานในช่วงสุดสัปดาห์ได้อย่างไร คุณมองไปที่ถังขยะที่มีหลอดไฟแล้วให้ความคิดที่สดใสไม่ใช่อย่างแท้จริง

บางครั้งคุณต้องการใช้ polymorphism เพื่อปิดบางสิ่งโดยไม่ทำให้แตกหัก

แก้จุดบกพร่อง

เมื่อคุณตั้งค่าเบรกพอยต์คุณจำเป็นต้องมีที่สำหรับให้เบรกพอยต์อยู่ ตอนนี้ให้แน่ใจว่า debuggers บางคนจะให้คุณวางไว้ในวงเล็บปีกกาปิด แต่ถ้าพวกเขาทำไม่ได้มันก็ดีภาษาที่ให้คุณบังคับให้มีที่วางหนึ่งแม้ว่าที่นั่นจะไม่ทำอะไรเลย

ไม่ใช่สิ่ง java จริงๆ แต่ยังมี:

เล่นซอไบนารี

แอสเซมบลี NOP คำสั่งอนุญาตให้เล่นซอกับปฏิบัติการไบนารีที่คอมไพล์แล้ว แต่คอมไพเลอร์ java สมัยใหม่ปรับให้เหมาะสมมากขึ้นฉันไม่แน่ใจว่าเซมิโคลอนไม่เพียงแค่ไปที่ไอ แต่ในสมัยก่อนเรายังใช้จุดที่ว่างเปล่าเหล่านี้ในการปฏิบัติการเพื่อควบคุมเวลาหรืออนุญาตให้เราหล่นตะขอ หากไม่มี NOP จะมีคำแนะนำจริงอยู่ที่นั่นดังนั้นหากคุณต้องการขอคุณจะต้องคัดลอกคำแนะนำเหล่านั้นไปที่อื่นเพื่อให้มีที่ว่างสำหรับเบ็ด มันใช้งานได้ดีในภาษา c ซึ่ง Java ได้รับไวยากรณ์มาก แต่ฉันไม่คิดว่าการเล่นซอเบ็ดนี้เกิดขึ้นมากใน Java เราใช้Aspect Oriented Programmingเพื่อทำสิ่งนั้น


2
สิ่งนี้อาจดูอวดรู้ แต่ตัวอย่างที่forไม่ใช่คำสั่งที่เป็นโมฆะ คำสั่ง Null (อาคาว่างเปล่า) อาจเกิดขึ้นในที่เดียวกันคำสั่งอื่น ๆ (เช่นif) อาจเกิดขึ้นได้ แต่วงเล็บดังต่อไปนี้forไม่อนุญาตให้ใช้คำสั่งระหว่างเครื่องหมายอัฒภาค แต่มีเพียงตัวเริ่มต้นและสองนิพจน์เท่านั้น ดังนั้นจึงเป็นการใช้เซมิโคลอนที่แตกต่างจาก statment-terminator ข้อความว่างจะเป็นอัฒภาคสุดท้ายในfor(;;);
JacquesB

คุณพูดถูกแล้วนี่มันช่างอึกทึก: P. ไม่เป็นไรโปรดทราบการแก้ไขของฉัน
candied_orange

-7

ฉันใช้เพราะ Java ได้รับการออกแบบในลักษณะที่ไม่สอดคล้องกับภาษามนุษย์ เช่นเดียวกับ C.

statement;คำสั่งคือ

คำสั่ง if-then-else คือ if (condition) statement; else statement;

คำสั่ง if-then-else พร้อมบล็อกประกอบคือ if (condition) {statements} else {statements}

นี่เป็นเรื่องไร้สาระอย่างชัดเจน

ฉันเขียนตามif (condition) {statements} else {statements};ที่สมเหตุสมผลและสมเหตุสมผล

หากนักออกแบบของ Java ต้องการที่จะปฏิบัติเช่นนี้ถ้าอย่างอื่นแล้วตามด้วยคำสั่งที่เป็นโมฆะฉันไม่เป็นไร ถ้ามันทำให้พวกเขามีความสุขปล่อยให้มันทำให้พวกเขามีความสุข


if (condition) {statements;} else {statements;}มัน นอกจากนี้ Java ยังค่อนข้างสอดคล้องกับไม่ต้องการ;หลังจาก}นั้น ชนิดของภาษามนุษย์มักจะไม่ติดจุดในตอนท้ายของประโยคที่ลงท้ายด้วยเครื่องหมายคำถาม (แน่นอนว่ายังมี!?หรือ?!ตอนจบ แต่ผู้ที่เป็นเพียงการประมาณของที่ตัวละคร Interrobang .)
8bittree

1
พระเจ้าแสนหวาน !! o_O
Áxel Costas Pena
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.