จะสร้างซิงเกิลตันใน Java ได้อย่างไร ประเภทของการเริ่มต้น การเปรียบเทียบ และประเด็นที่ต้องจำ

เผยแพร่แล้ว: 2020-10-07

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

คลาส Singleton เป็นหนึ่งในรูปแบบการออกแบบที่สำคัญในการเขียนโปรแกรม Java คลาสซิงเกิลตันช่วยในการจำกัดทรัพยากรและเพิ่มประสิทธิภาพ มีการใช้กันอย่างแพร่หลายในการเชื่อมต่อฐานข้อมูลหรือซ็อกเก็ต มีรูปแบบการใช้งานสำหรับคลาส singleton และนักพัฒนาที่ดีต้องรู้เกี่ยวกับมัน ให้เราดูการใช้งานคลาส singleton ใน Java

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

อ่าน: คำอธิบายสถาปัตยกรรมและส่วนประกอบ Java

สารบัญ

การเริ่มต้น

การเริ่มต้น ซิงเกิลตันใน Java ทำได้ผ่านคอนสตรัคเตอร์ส่วนตัว ตัวสร้างส่วนตัวช่วยในคลาสอื่น ๆ ที่ไม่สามารถสร้างอินสแตนซ์เดียวกันกับคลาสซิงเกิลตันของคุณได้ การเริ่มต้นคลาส singleton ใน Java มีห้าประเภทซึ่งแสดงอยู่ด้านล่าง:

1. การเริ่มต้นอย่างกระตือรือร้น

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

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

2. การเริ่มต้นขี้เกียจ

อินสแตนซ์ของคลาสเริ่มต้นในเมธอด getInstance () ในการเริ่มต้นแบบสันหลังยาว เมธอดในการเริ่มต้นแบบสันหลังยาวจะตรวจสอบว่าอินสแตนซ์ของคลาสนั้นถูกสร้างขึ้นหรือไม่ และไม่ได้สร้างไว้ จะสร้างอินสแตนซ์เท่านั้น ซึ่งจะช่วยแก้ปัญหาการรั่วไหลของหน่วยความจำได้

วิธีที่หนึ่งสร้างขึ้นในการเริ่มต้นแบบสันหลังยาวเป็นแบบสแตติกและมีอ็อบเจ็กต์ประเภทส่งคืน อินสแตนซ์ซิงเกิลตันในการเริ่มต้นแบบสันหลังยาวจะไม่ถูกสร้างขึ้นจนกว่าจะมีการเรียกเมธอด getInstance() เป็นครั้งแรก

3. การเริ่มต้น Lazy ด้วยวิธี Double Lock

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

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

4. วิธีการโหลดแบบขี้เกียจ

คลาสภายในที่ซ้อนกันถูกสร้างขึ้นในวิธีนี้และทำงานบนหลักการของ JLS (ข้อกำหนดภาษา Java) จะไม่มีสมาชิกข้อมูลคงที่ในชั้นเรียน JVM จะไม่สร้างอินสแตนซ์ของคลาส อินสแตนซ์จะถูกสร้างขึ้นตามความต้องการเมื่อเราเรียกใช้เมธอด getInstance() เท่านั้น

คุณไม่จำเป็นต้องซิงโครไนซ์วิธีการสำหรับการเริ่มต้น & การโหลด เนื่องจากวิธีนี้ช่วยในการซิงโครไนซ์อัตโนมัติของการเรียกรับอินสแตนซ์ ()

5. วิธีการ Enums

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

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

อ่านเพิ่มเติม: โปรแกรมรูปแบบ 12 อันดับแรกใน Java ที่คุณควรชำระเงินวันนี้

การทำให้เป็นอนุกรมและการสะท้อน

Serialization ช่วยในการขนส่งวัตถุ Java จาก JVM (Java Virtual Machine) ไปยังอีกเครื่องหนึ่ง การทำให้เป็นอันดับเป็นหนึ่งในวิธีการที่ใช้ในการสร้างหลายอินสแตนซ์ของคลาส การทำให้เป็นอนุกรมจะแปลงอ็อบเจ็กต์ให้เป็นสตรีมแบบไบต์ จากนั้นจึงทำการโอนย้ายเสร็จสิ้น

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

การสะท้อนยังเป็นวิธีการโคลนวัตถุใน Java Reflection เป็น API ที่ช่วยให้เรารู้จักคลาสของอ็อบเจกต์ & เมธอดที่ไม่รู้จักของคลาสนั้น ๆ ซึ่งสามารถเข้าถึงได้ผ่านอ็อบเจกต์ โปรแกรมเมอร์ใช้ Reflection อย่างกว้างขวางในการปรับเปลี่ยนพฤติกรรมของคลาส & เมธอด ณ รันไทม์

คำสั่งหลักสามคำสั่งที่ใช้ในการสะท้อนคือ getClass() เพื่อทราบคลาสที่เป็นของวัตถุ, getConstructors() เพื่อรับตัวสร้างสาธารณะของคลาสของวัตถุ, getMethods() เพื่อทราบวิธีการสาธารณะของคลาสภายใต้การสังเกต

คลาสธรรมดากับคลาสซิงเกิลตัน

คลาสมาตรฐานใน Java ใช้ตัวสร้างเพื่อเริ่มต้นตัวเอง ในขณะที่เราใช้เมธอด getInstance() เพื่อเริ่มต้นคลาสซิงเกิลตัน เรายังสามารถใช้ชื่อคลาสและเมธอดเดียวกันได้ เราสร้างวัตถุก่อนสำหรับคลาสปกติ จากนั้นเราใช้วิธีการและคุณสมบัติของมัน

ในทางตรงกันข้าม ในคลาส singleton เราสร้างอินสแตนซ์โดยใช้คุณสมบัติสแตติกของคลาส และทุกจุดในโค้ด คลาสนั้นจะส่งกลับเพียงอินสแตนซ์เดียวเท่านั้น

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

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

คะแนนเพื่อสร้างคลาสซิงเกิลตันที่สมบูรณ์แบบ

1. ประเด็นที่ควรเน้นเพื่อสร้างคลาสซิงเกิ้ลที่สมบูรณ์แบบมีดังนี้:

2. หากคุณกำลังสร้างหลายเธรดในคลาสซิงเกิลตัน ตรวจสอบให้แน่ใจว่าเธรดทั้งหมดไม่ควรเริ่มต้นคลาสซิงเกิลตันพร้อมกัน เราควรพยายามสร้างคลาส singleton ที่ปลอดภัยต่อเธรด

3. สร้างการพิสูจน์การสะท้อนของคลาส singleton ของคุณผ่านการเปลี่ยนการมองเห็นคอนสตรัคเตอร์เป็นสาธารณะในขณะใช้งาน & ตรวจสอบให้แน่ใจว่ามีเพียงหนึ่งอินสแตนซ์ของคลาส singleton ใดโดยเฉพาะ

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

ต้องอ่าน: แนวคิดโครงการ Java ที่น่าสนใจสำหรับผู้เริ่มต้น

บทสรุป

คลาสซิงเกิลตันใช้เพื่อสร้างการเชื่อมต่อกับฐานข้อมูลหรือโปรแกรมใดๆ ที่คุณต้องการควบคุมเมธอดและอินสแตนซ์ของคลาส

หากคุณต้องการพัฒนาทักษะ Java ของคุณ คุณต้องลงมือทำโปรเจ็กต์ Java เหล่านี้ หากคุณสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับ Java, การพัฒนา full stack, ลองดู โปรแกรม Executive PG ของ upGrad & IIIT-B ในการพัฒนาซอฟต์แวร์- ความเชี่ยวชาญพิเศษในการพัฒนา Full Stack ซึ่งออกแบบมาสำหรับมืออาชีพที่ทำงานและมีการฝึกอบรมที่เข้มงวดมากกว่า 500 ชั่วโมง 9 + โครงการและการมอบหมาย สถานะศิษย์เก่า IIIT-B โครงการหลักในทางปฏิบัติและความช่วยเหลือด้านงานกับ บริษัท ชั้นนำ

มาเป็นนักพัฒนาเต็มรูปแบบ

สมัครเรียนวิทยาศาสตรมหาบัณฑิตสาขาวิทยาการคอมพิวเตอร์