ตัวดำเนินการอินสแตนซ์ Java ของการพิจารณาการสะท้อนและสิ่งที่กำหนดสะท้อน?


24

ฉันได้พูดคุยกับเพื่อนร่วมงานในวันนี้ไม่ว่าการใช้งานตัวดำเนินการ Java instanceofนั้นเป็นสิ่งที่สะท้อนออกมาหรือไม่ และการอภิปรายพัฒนาอย่างรวดเร็วในสิ่งที่กำหนดสะท้อน

ดังนั้นคำจำกัดความของการสะท้อนคืออะไร?

และการใช้งานของการinstanceofพิจารณา "ใช้การสะท้อน" คืออะไร?

และนอกจากนี้หากinstanceofพิจารณาว่าเป็นเงาสะท้อนแล้วความหลากหลายนั้นก็ไม่ "ใช้การสะท้อน" เช่นกัน? ถ้าไม่ต่างกันคืออะไร


4
คุณตอบคำถามของคุณเองแล้ว วิธีการที่คุณกำหนด 'การสะท้อน' กำหนดว่าinstanceofเป็นตัวอย่างของการสะท้อน แน่นอนว่ามันอยู่ระหว่างการใช้ข้อมูลปกติกับการใช้ข้อมูลเมตาผ่านทางgetClass()& เพื่อน ๆ แต่คุณสามารถมีคำจำกัดความที่ใช้งานได้
Kilian Foth

การใช้งานของreturn"การเขียนโปรแกรมโครงสร้าง" ถือว่าเป็นหรือไม่?
เอสเอฟ

คำตอบ:


22

นี่คือความหมายของการสะท้อนตามวิกิพีเดีย:

ในวิทยาการคอมพิวเตอร์การไตร่ตรองเป็นกระบวนการที่โปรแกรมคอมพิวเตอร์สามารถสังเกต (ทำการพิมพ์วิปัสสนา)และปรับเปลี่ยนโครงสร้างและพฤติกรรมของมันเองที่รันไทม์

ฉันไม่สามารถบอกได้ว่ามันดีกว่าตัวเองและเน้นส่วนที่สำคัญสำหรับคำถามของคุณ ที่กล่าวว่าใช่instanceofถือเป็นการใช้การสะท้อน โปรแกรมสังเกตโครงสร้างและดำเนินการประเภทวิปัสสนา


3
@Steven Jeuris: ความแตกต่างคือif (true)รูปลักษณ์ที่คุ้มค่าไม่ได้ที่ประเภท นั่นเป็นเหตุผลที่มันไม่ถือว่าเป็นภาพสะท้อน
sleske

1
@sleske: เหตุผลที่ฉันพูดถึงมันเป็นเพราะการสังเกตแบบนั้นเป็นหลักการพื้นฐาน ถ้าไม่มีมันก็จะไม่มี polymorphism ในทางเทคนิคการพูดสิ่งนี้หมายถึงการแทนที่อย่างง่ายอาจถูกพิจารณาถึงการสะท้อน (หรืออย่างน้อยก็เป็นผลลัพธ์) อย่าลืมส่วนที่สองของคำจำกัดความ: และปรับเปลี่ยนโครงสร้างและพฤติกรรมของตนเองที่รันไทม์ ทั้งหมดในทุกฉัน upvoted คำตอบนี้ (ตรวจสอบความคิดเห็นที่สองของฉัน) แต่ฉันเข้าใจว่าคำถามจาก OP มาจากไหน ; p
Steven Jeuris

1
ตามคำจำกัดความของการสะท้อนความเห็นพหุสัณฐานปกติจะไม่เป็นชนิดของการสะท้อน?
Bjarke Freund-Hansen

4
@ barkark: ฉันจะพูดว่า "ไม่" ในขณะที่การจัดส่งเสมือนที่ใช้โดย polymorphism ทำโดยปริยายโดยภาษาตัวเองมากกว่ารหัสแอปพลิเคชันตรวจสอบวัตถุที่เป็นปัญหาอย่างชัดเจนเพื่อระบุลักษณะของมัน
Dave Sherohman

2
@Dave Sherohman: ฉันยังเพิ่มว่างานส่วนใหญ่ (การตั้งค่าตารางกระโดด ฯลฯ ) จะทำในเวลารวบรวมไม่ใช้เวลา
TMN

13

เพื่อความชัดเจนฉันจะพิจารณาคำตอบสองข้อ

ในทางทฤษฎี , instanceofเป็นรูปแบบของการสะท้อนตามที่อธิบายไว้ในคำตอบของเหยี่ยว

ในวิทยาการคอมพิวเตอร์การไตร่ตรองเป็นกระบวนการที่โปรแกรมคอมพิวเตอร์สามารถสังเกต (ทำการพิมพ์วิปัสสนา) และปรับเปลี่ยนโครงสร้างและพฤติกรรมของมันเองที่รันไทม์

อย่างไรก็ตามในทางปฏิบัติเมื่อโปรแกรมเมอร์พูดถึงการใช้การสะท้อนภาพเขามักจะอ้างถึงมากกว่าเพียงแค่ตรวจสอบว่าตัวแปรเป็นประเภทที่แน่นอนหรือไม่ นี้เป็นเช่นแนวคิดพื้นฐานโดยที่แตกต่างจะเป็นไปไม่ได้

โปรดทราบว่าการใช้instanceofมักจะระบุถึงกลิ่นของรหัสและความหลากหลายที่เหมาะสมสามารถใช้แทนได้


1
+1 สำหรับกลิ่นของรหัสที่อาจเกิดขึ้น - ไม่เสมอไปที่เป็นไปได้
Gary Rowe

2

คุณอาจสนใจบทความต่อไปนี้: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

คีย์ในบทความนี้เป็นข้อมูลโค้ดที่พวกเขาจำลองคีย์เวิร์ด "instanceof" โดยใช้เมธอด "isInstance" ของคลาส "Class" ซึ่งเป็นส่วนหนึ่งของคุณลักษณะการสะท้อนของ Java


คำอธิบายที่ดีสำหรับ Java
เหยี่ยว

2

ตั้งแต่คำตอบอื่น ๆ คำจำกัดความในวิกิพีเดียก็เปลี่ยนไป (ฉันบังเอิญเห็นด้วยกับการเปลี่ยนแปลงนี้ แต่ฉันไม่ใช่คนที่สร้างมันขึ้นมา) เพื่อลบส่วนในวงเล็บ:

ในด้านวิทยาศาสตร์คอมพิวเตอร์การสะท้อนกลับคือความสามารถของโปรแกรมคอมพิวเตอร์ในการตรวจสอบการใคร่ครวญและการปรับเปลี่ยนโครงสร้างและพฤติกรรมของตัวเองในช่วงรันไทม์

https://en.wikipedia.org/wiki/Type_introspectionยังกล่าวด้วยเช่นกัน

วิปัสสนาไม่ควรสับสนกับการสะท้อนกลับ

ฉันจะไม่พิจารณาinstanceofที่จะตกอยู่ภายใต้ความหมายแรก: โปรแกรมตรวจสอบค่าไม่ได้โครงสร้างของตัวเองและไม่เกี่ยวข้องกับค่าใด ๆ ที่เป็นตัวแทนของโครงสร้างโปรแกรม (ใน Java: java.lang.Class, java.reflect.Methodฯลฯ ); จุดเด่นของการสะท้อนคือการทำงานกับค่าดังกล่าว


-5

ใช่ตัวดำเนินการ "instanceof" เป็นรูปแบบของการสะท้อน คำตอบก่อนหน้านี้จะบอกคุณว่าทำไม

"Reflection" หรือ "introspection วัตถุ / คลาส" เป็นสิ่งที่เกินจริงในทุกวันนี้ แต่ภาษาการเขียนโปรแกรมหลายภาษาได้ใช้แนวคิดบางอย่างในบางเวลา

DOT NET (Java clone), (mis) ใช้มาก


1
อืมมม…เพื่อน ๆ
Konrad Rudolph

3
ประโยคแรกของคุณถูกต้องและซ้ำซ้อนเมื่อเผชิญกับคำตอบก่อนหน้า ที่เหลือก็ผิด
Frank Shearar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.