Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

นี่คือโพสต์ที่แปลด้วย AI

제이온

[Effective Java] รายการที่ 3: รับประกัน Singleton ด้วยคอนสตรัคเตอร์ส่วนตัวหรือไดเร็กทอรี

เลือกภาษา

  • ไทย
  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

สรุปโดย AI ของ durumis

  • Singleton คือคลาสที่สามารถสร้างอินสแตนซ์ได้เพียงหนึ่งเดียว และใช้สำหรับ สร้างวัตถุที่ไม่มีสถานะหรือส่วนประกอบของระบบที่ไม่ซ้ำกัน
  • วิธีการสร้าง Singleton ได้แก่ วิธีการที่สมาชิก public static เป็นฟิลด์แบบ final วิธีการที่ให้เมธอดแบบคงที่ และวิธีการที่ใช้ประเภทการแจกแจง โดยวิธีการที่ใช้ ประเภทการแจกแจงเป็นวิธีที่เหมาะสมที่สุด
  • เมื่อลำดับคลาส Singleton คุณต้องใช้อินเทอร์เฟซ Serializable และประกาศฟิลด์อินสแตนซ์ ทั้งหมดเป็น transient และเขียนทับเมธอด readResolve()

ซิงเกิลตัน

แนวคิดของซิงเกิลตัน

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


วิธีการสร้างซิงเกิลตัน

วิธีการใช้สมาชิก static ที่เป็น final field


public class Elvis {

    public static final Elvis INSTANCE = new Elvis();

    private Elvis() {
    }

    public void speak() {
        System.out.println("elvis");
    }


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


  • ข้อดี
    • ชัดเจนว่าคลาสนั้นเป็นซิงเกิลตันใน API
    • กระชับ


วิธีการมอบหมาย static factory method เป็น public static

public class Elvis {

    private static final Elvis INSTANCE = new Elvis();

    private Elvis() {
    }

    public static Elvis getInstance() {
        return INSTANCE;
    }

    public void speak() {
        System.out.println("elvis");
    }


วิธีนี้ยังรับประกันว่าเป็นอินสแตนซ์เดียวในระบบทั้งหมด ยกเว้นการดัดแปลงโดยใช้รีเฟล็กชัน แค่เปลี่ยนฟิลด์เป็น private และใช้วิธีการ static factory method ในการส่งคืนอ็อบเจ็กต์


  • ข้อดี
    • สามารถเปลี่ยนแปลงเป็น non-singleton ได้โดยไม่ต้องเปลี่ยนแปลง API
      • ตัวอย่างเช่น ส่งคืนอินสแตนซ์ที่แตกต่างกันสำหรับแต่ละเธรดที่เรียกใช้ static factory method
    • สามารถเปลี่ยนเป็น generic singleton factory method ได้หากต้องการ
    • สามารถใช้การอ้างอิงวิธีการของ static factory เป็น supplier
      • ตัวอย่างเช่น สามารถใช้ Elvis::getInstance เป็น Supplier<Elvis> ได้


หากไม่มีโอกาสใช้ข้อดีข้างต้น ควรใช้วิธีการแรก


วิธีการใช้ enum

public enum Elvis {

    INSTANCE;

    public void speak() {
        System.out.println("elvis");
    }


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

แต่ควรระวังว่าซิงเกิลตันที่จะสร้างนั้นสามารถสืบทอดอินเทอร์เฟซได้ แต่ไม่สามารถสืบทอดคลาสได้


สิ่งที่ควรระวังเมื่อซีเรียลไลซ์คลาสซิงเกิลตัน

หากต้องการซีเรียลไลซ์คลาสซิงเกิลตันที่สร้างโดยใช้วิธีการแรกหรือที่สอง คุณจะต้องประกาศทุกฟิลด์เป็น transient นอกเหนือจากการนำไปใช้ Serializable และกำหนด readResolve() method ใหม่


private Object readResolve throws ObjectStreamException {
    return INSTANCE;


แหล่งที่มา

제이온
제이온
제이온
제이온
[Effective Java] รายการ 5: ใช้การฉีดการพึ่งพาแทนการระบุทรัพยากร หากคลาสพึ่งพาทรัพยากรภายนอก การใช้ซิงเกิลตันและคลาสยูทิลิตี้แบบคงที่ไม่ใช่ความคิดที่ดี การฉีดการพึ่งพาช่วยปรับปรุงความยืดหยุ่น การนำกลับมาใช้ใหม่และความสะดวกในการทดสอบของคลาส และการใช้รูปแบบวิธีการของโรงงานทำให้การฉีดการพึ่งพา มีประสิทธิภาพมากขึ้น

28 เมษายน 2567

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

28 เมษายน 2567

[Effective Java] รายการ 6. หลีกเลี่ยงการสร้างอ็อบเจ็กต์ที่ไม่จำเป็น คู่มือเกี่ยวกับวิธีลดการสร้างอ็อบเจ็กต์ที่ไม่จำเป็นใน Java อ็อบเจ็กต์แบบไม่เปลี่ยนแปลง เช่น String, Boolean ควรใช้ลิเทอรัล และควรแคชอินสแตนซ์ Pattern สำหรับนิพจน์ทั่วไป นอกจากนี้ การออโต้บอกซ์อาจทำให้ประสิทธิภาพลดลง ดังนั้นจึงควรใช้ประเภทพื้นฐาน รายละเอีย

28 เมษายน 2567

[Javascript] โครงสร้างของวัตถุ (V8) วัตถุของ JavaScript ในเครื่องยนต์ V8 ถูกแปลงเป็น Fast mode ที่ปรับให้เหมาะสมเหมือนโครงสร้างข้อมูลตามสถานะและ Dictionary mode ที่ทำงานเป็นแฮชแมป Fast mode เร็วเนื่องจากคีย์และค่าอยู่ในรูปแบบคงที่เกือบทั้งหมด แต่เมื่อมีการเพิ่มคีย์ใหม่หรือดำเนินการลบองค์ประ
곽경직
곽경직
곽경직
곽경직
곽경직

18 มีนาคม 2567

[นอกสายงาน วิศวกร สู้ชีวิต] 17. พอร์ตโฟลิโอของวิศวกรมือใหม่ ไปถึงไหน? พอร์ตโฟลิโอของวิศวกรมือใหม่ควรเน้นไปที่ทักษะการพัฒนา ซอฟต์แวร์ การติดตั้ง Infra ทั้งหมดนั้นไม่จำเป็นเท่ากับการสร้างฟังก์ชัน CRUD พื้นฐาน และการสะสมประสบการณ์การเชื่อมต่อ API ภายนอก สามารถลองใช้ API เช่น การเข้าสู่ระบบของ Naver, API แผนที่ Naver, API ของ
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 เมษายน 2567

การสร้างแบบจำลองข้อมูลเชิงแนวคิด การสร้างแบบจำลองข้อมูลเชิงแนวคิดเป็นกระบวนการแยกเอนทิตีและแสดงความสัมพันธ์ระหว่างเอนทิตีในรูปแบบ ERD เอนทิตีเป็นหน่วยข้อมูลอิสระ และแอตทริบิวต์คือข้อมูลที่เอนทิตีมี ตัวระบุคือสิ่งที่ระบุเอนทิตีเฉพาะและความสัมพันธ์แสดงถึงการโต้ตอบระหว่างเอนทิตี คาร์ดินัลลิ
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

8 เมษายน 2567

JWT (JSON Web Token) คืออะไร? JSON Web Token (JWT) เป็นมาตรฐานเปิดสำหรับการส่งข้อมูลอย่างปลอดภัย โดยใช้โทเค็นที่ลงนามเพื่อรักษาความสมบูรณ์และความปลอดภัยของข้อมูล ส่วนหัวประกอบด้วยประเภทโทเค็นและอัลกอริทึมการลงนาม และเพย์โหลดประกอบด้วยข้อมูลผู้ใช้ที่ผู้พัฒนาต้องการ รวมอยู่ด้วย JWT ที่ล
Seize the day
Seize the day
Seize the day
Seize the day
Seize the day

4 มีนาคม 2567

การสร้างแบบจำลองข้อมูลเชิงตรรกะ การสร้างแบบจำลองข้อมูลเชิงตรรกะคือกระบวนการแปลงแบบจำลองข้อมูลเชิงแนวคิดให้สอดคล้องกับรูปแบบฐานข้อมูลเชิงสัมพันธ์ โดยใช้กฎการแมป ซึ่งเกี่ยวข้องกับ การจัดการความสัมพันธ์ 1:1, 1:N, N:M และการทำให้เป็นปกติเพื่อให้ได้มาซึ่งความสมบูรณ์ของข้อมูล 1NF, 2NF, 3NF ผ่
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

9 เมษายน 2567

วิธีที่ Rust ป้องกันบั๊กแบบพร้อมกัน Rust เป็นภาษาที่ทรงพลังในการแก้ปัญหาความท้าทายของการเขียนโปรแกรมแบบพร้อมกัน ระบบประเภทและแบบจำลองการเป็นเจ้าของทำให้การส่งผ่านและการแชร์ข้อมูลระหว่างเธรดปลอดภัย Mutex, Channel, Atomic และรูปแบบความแปรปรวนภายในอื่น ๆ ช่วยให้คุณกำหนดและใช้ตัวแปรที่แชร์ได้อย
곽경직
곽경직
곽경직
곽경직
곽경직

28 มีนาคม 2567