제이온

[Effective Java] รายการที่ 5: อย่าระบุทรัพยากรโดยตรง ให้นำการฉีดพึ่งพา (Dependency Injection) มาใช้แทน

สร้าง: 2024-04-28

สร้าง: 2024-04-28 13:39

หากคลาสพึ่งพาแหล่งข้อมูลภายในอย่างน้อยหนึ่งแหล่ง และแหล่งข้อมูลเหล่านั้นส่งผลต่อการทำงานของคลาส ไม่ควรใช้ Singleton และ Static Utility Class


คลาสไม่ควรสร้างแหล่งข้อมูลเหล่านี้เอง แต่ควรส่งผ่านแหล่งข้อมูลที่จำเป็นไปยัง Constructor แทน การฉีด Dependency (Dependency Injection) จะช่วยปรับปรุงความยืดหยุ่น การนำกลับมาใช้ใหม่ และความสะดวกในการทดสอบของคลาส


ตัวอย่าง

ตัวอย่างการใช้ Static Utility Class

Utility Class นี้สมมติว่าใช้พจนานุกรมเพียงหนึ่งเดียว แต่ในความเป็นจริง พจนานุกรมอาจแบ่งตามภาษา และอาจมีพจนานุกรมเฉพาะสำหรับคำศัพท์เฉพาะอีกด้วย


ตัวอย่างการใช้ Singleton Class


Singleton Class ก็มีข้อเสียเช่นเดียวกัน เนื่องจากสมมติว่าใช้พจนานุกรมเพียงหนึ่งเดียว


วิธีแก้ปัญหาที่ 1 - ลบ final keyword ออกจาก field


เราสามารถลบ final keyword ออกจาก dictionary ใน Static Utility Class หรือ Singleton Class และออกแบบให้เปลี่ยน dictionary เป็นพจนานุกรมอื่นจากภายนอกได้ แต่แนวทางนี้ใช้ยาก และอาจทำให้เกิดปัญหาเรื่องความพร้อมกัน (Concurrency Issue) ในสภาพแวดล้อมแบบ Multi-thread


วิธีแก้ปัญหาที่ 2 - ใช้ Dependency Injection


จากตัวอย่างนี้ เราสามารถเรียนรู้ได้ว่า Static Class และ Singleton Class ไม่ควรพึ่งพาแหล่งข้อมูลภายใน นั่นหมายความว่าควรส่งผ่านแหล่งข้อมูลจากภายนอกเข้ามาแทน


คลาสที่ใช้ Dependency Injection จะสามารถรับประกันความคงที่ (Immutability) ได้ด้วย final keyword และยังรองรับ Instance ของแหล่งข้อมูลหลายๆ อันอีกด้วย นอกจากนี้ Dependency Injection สามารถนำไปใช้ได้ทั้งใน Constructor Static Factory และ Builder


Dependency Injection ไม่เพียงแต่ส่งผ่านแหล่งข้อมูลโดยตรงเท่านั้น แต่ยังสามารถส่งผ่าน Factory ของแหล่งข้อมูลได้ด้วย Factory คือ Object ที่สร้าง Instance ของ Type เฉพาะซ้ำๆ ทุกครั้งที่ถูกเรียกใช้ รูปแบบนี้เรียกว่า Factory Method Pattern และ Supplier<T> ใน Java 8 เป็นตัวอย่างที่สมบูรณ์แบบของ Factory



โดยทั่วไปจะใช้ Type Parameter ที่มี Bounded Wildcard เพื่อจำกัด Type ของ Factory วิธีนี้ช่วยให้ Client สามารถส่งผ่าน Factory ใดๆ ก็ได้ตราบใดที่เป็น Subtype ของ Type ที่ระบุ


Dependency Injection ช่วยเพิ่มความยืดหยุ่นและความสะดวกในการทดสอบ แต่ในโครงการที่มี Dependency จำนวนมากอาจส่งผลให้เกิดค่าใช้จ่ายสูง ในกรณีเช่นนี้ เราสามารถใช้ Dependency Injection Framework (เช่น Dagger, Guice, Spring) เพื่อลดค่าใช้จ่ายได้


แหล่งที่มา

ความคิดเห็น0

คู่มือโหมดมืด iPhone: ตั้งค่าและใช้งานอย่างสมบูรณ์แบบคู่มือการตั้งค่าและใช้งานโหมดมืดบน iPhone เพื่อลดความเมื่อยล้าของดวงตาและประหยัดแบตเตอรี่ พร้อมวิธีการตั้งค่า 3 วิธีและคำถามที่พบบ่อย เรียนรู้วิธีการใช้แอปการตั้งค่า ศูนย์ควบคุม และแอปทางลัด
뉴스코리아
뉴스코리아
뉴스코리아
뉴스코리아

November 4, 2024

คู่มือการตั้งค่า iPhone ที่ดีที่สุดเพื่อปกป้องสายตาปกป้องสายตาและลดความเมื่อยล้าของดวงตาด้วยการตั้งค่า iPhone ที่เหมาะสม ใช้ประโยชน์จากฟีเจอร์ต่างๆ เช่น โหมดมืด, True Tone และ Night Shift เพื่อประสบการณ์การใช้งานสมาร์ทโฟนที่สะดวกสบาย
뉴스코리아
뉴스코리아
뉴스코리아
뉴스코리아

November 4, 2024

สาเหตุ อาการ การวินิจฉัย และการรักษาโรคจุดบอดลอยในตาเรียนรู้เกี่ยวกับอาการของโรคจุดบอดลอยในตา เช่น ตาแห้ง ความเมื่อยล้าของดวงตา สายตาพร่ามัว รวมถึงสาเหตุ การวินิจฉัย และวิธีการรักษา ดูแลสุขภาพดวงตาด้วยวิธีง่ายๆ และทำความเข้าใจกับความเข้าใจผิดเกี่ยวกับโรคนี้
세상 모든 정보
세상 모든 정보
세상 모든 정보
세상 모든 정보

April 5, 2024

สาเหตุ อาการ การวินิจฉัย และการรักษาโรคต้อหินต้อหินเป็นโรคที่ทำให้สูญเสียการมองเห็นอันเนื่องมาจากความดันในลูกตาสูงขึ้น ควรทำความเข้าใจเกี่ยวกับอาการ สาเหตุ การวินิจฉัย และวิธีการรักษา รวมถึงการป้องกันโรคต้อหิน
세상 모든 정보
세상 모든 정보
세상 모든 정보
세상 모든 정보

April 5, 2024

รู้จักอาการตั้งครรภ์ในช่วงเริ่มแรกเราจะมาบอกอาการตั้งครรภ์ 10 ประการในช่วงเริ่มแรก (ประจำเดือนขาด, เลือดออกจากการฝังตัว, การเปลี่ยนแปลงของเต้านม ฯลฯ) หากมีอาการแนะนำให้ตรวจครรภ์แล้วไปพบแพทย์
김성현
김성현
김성현
김성현

November 17, 2024

5 เมนูอาหารเช้าสุดยอด ที่ช่วยดูแลสุขภาพของคุณแนะนำ 5 เมนูอาหารเช้าที่ดีที่สุดสำหรับสุขภาพ (ถั่วต่างๆ, น้ำผึ้ง, ขนมปังโฮลวีต, ข้าวต้ม, บลูเบอร์รี่) พร้อมเน้นย้ำถึงความสำคัญของการรับประทานอาหารที่มีประโยชน์ต่อสุขภาพ
알려드림
알려드림
알려드림
알려드림

March 29, 2024