ฉันมีสิ่งนี้ในรหัสของฉัน
Thread.currentThread().sleep(x);
Eclipse บอกให้ฉันใช้แบบคงที่
Thread.sleep(x);
แทนทำไม? อะไรคือความแตกต่างในการทำงานระหว่าง 2 วิธีนี้มีความแตกต่างกันบ้าง?
ฉันมีสิ่งนี้ในรหัสของฉัน
Thread.currentThread().sleep(x);
Eclipse บอกให้ฉันใช้แบบคงที่
Thread.sleep(x);
แทนทำไม? อะไรคือความแตกต่างในการทำงานระหว่าง 2 วิธีนี้มีความแตกต่างกันบ้าง?
คำตอบ:
มีเพียงวิธีเดียวไม่ใช่สองวิธีและเป็นแบบคงที่ แม้ว่าคุณสามารถเรียกวิธีการแบบคงที่ผ่านการอ้างอิงอินสแตนซ์ แต่ก็ไม่ใช่รูปแบบที่ดี แสดงว่าโปรแกรมเมอร์คิดว่าเขากำลังเรียกใช้วิธีการอินสแตนซ์ โปรแกรมเมอร์ที่สับสนอาจคิดว่าเขาสามารถทำให้เธรดอื่น (ไม่ใช่เธรดปัจจุบัน) เข้าสู่โหมดสลีปได้ด้วยวิธีนี้เมื่อนั่นไม่ใช่สิ่งที่ทำ
รหัสทั้งสองบรรทัดของคุณทำสิ่งเดียวกัน แต่อย่างที่สองเป็นรูปแบบที่ดีกว่า
ใน Java การนอนหลับเป็นวิธีการคงที่ ทั้งสองตัวอย่างของคุณทำสิ่งเดียวกันทุกประการ แต่เวอร์ชันก่อนหน้านั้นสับสนเพราะดูเหมือนว่ากำลังเรียกใช้เมธอดบนวัตถุเฉพาะ แต่ไม่ได้ทำเช่นนั้นเลย ในตัวอย่างของคุณมันไม่สำคัญมากนัก แต่จะอันตรายกว่าหากคุณมีสิ่งต่อไปนี้:
someOtherThread.sleep(x);
คราวนี้ดูเหมือนว่าคุณจะบอกให้ด้ายอื่นนอน แต่อันที่จริงคุณกำลังทำให้เธรดปัจจุบันเข้าสู่โหมดสลีป วิธีหลีกเลี่ยงการทำผิดประเภทนี้คือการเรียกใช้วิธีการแบบคงที่โดยใช้คลาสแทนที่จะเป็นวัตถุเฉพาะ
การเรียกใช้เมธอดทั้งสองเหมือนกันในลักษณะการทำงานเนื่องจากเรียกใช้เมธอดเดียวกัน แต่ใช้ชื่อคลาส ( เธรดในกรณีนี้) แทนที่จะเป็นอินสแตนซ์สำหรับการเข้าถึงฟิลด์และเมธอดแบบคงที่ทำให้คงที่นี้ชัดเจน นั่นคือสาเหตุที่ทำให้เกิดคำเตือนนี้
แต่เมื่อพิจารณาว่าฟิลด์และเมธอดแบบคงที่จะแสดงในลักษณะเฉพาะใน IDE ส่วนใหญ่ (ตัวอย่างเช่นในฟอนต์ตัวเอียงใน Eclipse และ IntelliJ IDEA) คำเตือนนี้ยังจำเป็นอยู่หรือไม่ อาจจะไม่จำเป็นเท่าในยุคแรก ๆ ของ Java ที่มีการใช้โปรแกรมแก้ไขทั่วไป
Thread.currentThread().sleep(x);
หรือวิธีที่Eclipseบอกว่าThread.sleep(x);
จำเป็นต้องมีบริบทคงที่หากจำเป็นดังนั้นเราจึงต้องหน่วงเวลาเล็กน้อยด้วยการนอนหลับนี้
กระบวนทัศน์แบบคงที่ที่กำหนดโดยวัตถุหนึ่งจะมีผลเฉพาะกับวงจรชีวิตการพิมพ์ฮีปของวัตถุนั้น ๆ เท่านั้นอีกครั้งเมื่อพิจารณาถึงวงจรชีวิตของวัตถุโดยรวมคงไม่น่ารำคาญหากจำเป็นก็สามารถใช้เพื่อลดการเขียนโค้ดได้ แต่ต้องทำอย่างระมัดระวังในรูปแบบคงที่ print ถูกอ้างถึงโดยClass
(ตัวอย่างเช่น: - Class.forName(pkg.className)
) ตามชื่อและไม่ใช่ตามชื่อใด ๆobject
ซึ่งเป็นสำเนาพิมพ์ครั้งเดียวของ Class ในHEAP
หน่วยความจำ
การใช้วัตถุอีกครั้งยังมีข้อดีข้อเสียโดย Weak, Phantom, การอ้างอิงที่แข็งแกร่ง .... ,
รหัสได้รับการแปลงโดยธรรมชาติ มันเป็นเพียงวิธีที่เราทำเพื่อให้มันใช้งานได้และใช้งานได้จริง