ข้อเสียของการสะท้อนโดยทั่วไป
การสะท้อนนั้นเข้าใจได้ยากกว่าโค้ดแบบเส้นตรง
จากประสบการณ์ของฉันการสะท้อนกลับเป็นคุณลักษณะ "ระดับผู้เชี่ยวชาญ" ใน Java ฉันจะยืนยันว่าโปรแกรมเมอร์ส่วนใหญ่ไม่เคยใช้การสะท้อนอย่างแข็งขัน (เช่นการใช้ห้องสมุดที่ใช้การสะท้อนกลับไม่นับ) ทำให้โค้ดที่ใช้นั้นยากที่จะเข้าใจสำหรับโปรแกรมเมอร์เหล่านี้
โค้ดสะท้อนไม่สามารถเข้าถึงการวิเคราะห์แบบคงที่ได้
สมมติว่าฉันมี getter ในชั้นเรียนของฉันและฉันต้องการที่จะเปลี่ยนชื่อเป็นgetFoo
getBar
หากฉันไม่ใช้การสะท้อนฉันสามารถค้นหารหัสฐานgetFoo
และจะพบทุก ๆ ที่ที่ใช้ getter เพื่อที่ฉันจะได้อัปเดตและแม้ว่าฉันจะพลาดผู้รวบรวมก็จะบ่น
แต่ถ้าสถานที่ที่ใช้ผู้ทะเยอทะยานเป็นสิ่งที่ชอบcallGetter("Foo")
และcallGetter
ทำgetClass().getMethod("get"+name).invoke(this)
แล้ววิธีการด้านบนจะไม่พบและผู้เรียบเรียงจะไม่บ่น คุณจะได้รับรหัสเมื่อทำงานจริงNoSuchMethodException
หรือไม่ และจินตนาการถึงความเจ็บปวดที่คุณกำลังเผชิญหากข้อยกเว้นนั้น (ซึ่งถูกติดตาม) ถูกกลืนโดยcallGetter
เพราะ "มันใช้กับสตริงที่มีการเข้ารหัสยากเท่านั้นมันจะไม่เกิดขึ้นจริง" (ไม่มีใครทำอย่างนั้นใครบางคนอาจเถียง? ยกเว้นว่า OP ทำอย่างนั้นในคำตอบ SO ของเขาหากมีการเปลี่ยนชื่อฟิลด์ผู้ใช้ setter ทั่วไปจะไม่สังเกตเห็น ผู้ใช้ getter อาจสังเกตเห็นผลลัพธ์ของคอนโซลของข้อยกเว้นที่ถูกละเว้น)
โค้ดตัวสะท้อนไม่ได้ตรวจสอบโดยคอมไพเลอร์
นี่เป็นจุดย่อยที่ใหญ่ของด้านบน Object
รหัสสะท้อนเป็นข้อมูลเกี่ยวกับ ประเภทจะถูกตรวจสอบที่รันไทม์ ข้อผิดพลาดถูกค้นพบโดยการทดสอบหน่วย แต่ถ้าคุณมีความครอบคลุม ("เป็นเพียงผู้ทะเยอทะยานฉันไม่จำเป็นต้องทดสอบ") โดยทั่วไปคุณเสียความได้เปรียบโดยใช้ Java มากกว่า Python ที่ทำให้คุณได้รับในตอนแรก
ไม่สามารถใช้รหัสการสะท้อนได้
อาจจะไม่ได้อยู่ในทฤษฎี แต่ในทางปฏิบัติคุณจะไม่พบว่า JVM inlines Method.invoke
หรือสร้างแคชอินไลน์สำหรับ การเรียกใช้เมธอดปกติพร้อมใช้งานสำหรับการปรับแต่งเช่นนี้ ทำให้พวกเขาเร็วขึ้นมาก
รหัสตัวสะท้อนนั้นโดยทั่วไปแล้วจะช้า
การค้นหาเมธอดแบบไดนามิกและการตรวจสอบชนิดที่จำเป็นสำหรับโค้ดการสะท้อนจะช้ากว่าการเรียกเมธอดปกติ หากคุณเปลี่ยนสิ่งที่ทะลุทะลวงเส้นเดียวราคาถูกให้กลายเป็นสัตว์ร้ายคุณอาจ (ฉันไม่ได้วัดสิ่งนี้) ดูที่คำสั่งหลายขนาดของการชะลอตัว
ข้อเสียของ getter / setter ทั่วไปโดยเฉพาะ
นั่นเป็นเพียงความคิดที่ไม่ดีเพราะตอนนี้ชั้นเรียนของคุณไม่มีการห่อหุ้มอีกต่อไป ทุกฟิลด์ที่สามารถเข้าถึงได้ คุณอาจทำให้พวกเขาเป็นสาธารณะทั้งหมด