![translation](https://cdn.durumis.com/common/trans.png)
นี่คือโพสต์ที่แปลด้วย AI
[Effective Java] รายการ 4. ใช้ตัวสร้างส่วนตัวเพื่อป้องกันการสร้างอินสแตนซ์
- ภาษาที่เขียน: ภาษาเกาหลี
- •
-
ประเทศอ้างอิง: ทุกประเทศ
- •
- เทคโนโลยีสารสนเทศ
เลือกภาษา
สรุปโดย AI ของ durumis
- เมื่อสร้างคลาสยูทิลิตี้ที่มีเพียงเมธอดคงที่และฟิลด์ ควรสร้างตัวสร้างเป็นส่วนตัวเพื่อป้องกันการสร้างอินสแตนซ์
- วิธีนี้จะช่วยป้องกันการเรียกใช้ตัวสร้างจากภายนอกคลาส และช่วยให้สามารถควบคุมตัวสร้างพื้นฐานสาธารณะที่คอมไพเลอร์สร้างขึ้นโดยอัตโนมัติได้อย่างชัดเจน
- ตัวสร้างส่วนตัวจะทำให้ไม่สามารถสืบทอดได้ ดังนั้นจึงสามารถจำกัดการใช้งานที่ตั้งใจไว้ของคลาสยูทิลิตี้และเพิ่มความสามารถในการอ่านของรหัสได้
บางครั้งการใช้คลาสที่มีเฉพาะเมธอดแบบคงที่และฟิลด์แบบคงที่อาจมีประโยชน์
โดยทั่วไป คุณสามารถใช้คลาสยูทิลิตี้ เช่น java.lang.Math, java.util.Arrays ซึ่งรวบรวมเมธอดที่เกี่ยวข้องกับการคำนวณทางคณิตศาสตร์ หรืออาร์เรย์ คุณยังสามารถรวบรวมเมธอดแบบคงที่สำหรับการสร้างโรงงานสำหรับวัตถุที่ใช้ส่วนต่อประสานเฉพาะ เช่น java.util.Collections
คลาสยูทิลิตี้เหล่านี้สามารถใช้งานได้โดยไม่ต้องมีตัวแปรอินสแตนซ์หรือเมธอด ดังนั้นจึงไม่จำเป็นต้องมีคอนสตรักเตอร์ แต่ถ้าคุณไม่ได้ระบุ คอนสตรักเตอร์ คอมไพเลอร์จะสร้างคอนสตรักเตอร์เริ่มต้นแบบ public อัตโนมัติ ทำให้คุณไม่สามารถแยกแยะได้ว่าคอนสตรักเตอร์นี้สร้างขึ้น โดยอัตโนมัติ
เพื่อป้องกันปัญหานี้ บางครั้งเราจะสร้างเป็นคลาส abstract แต่คลาส abstract ไม่สามารถสร้างอินสแตนซ์ได้ เนื่องจากสามารถสร้าง คลาสย่อยและสร้างอินสแตนซ์ได้
public abstract class Person {
public static void speak(String message) {
System.out.println(message);
}
}
public class Student extends Person {
public Student() {
super();
}
ดังนั้นเพื่อป้องกันไม่ให้สร้างอินสแตนซ์ของคลาสยูทิลิตี้ คุณต้องตั้งค่าตัวควบคุมการเข้าถึงของคอนสตรักเตอร์เป็น private
public abstract class Person {
private Person() {
throw new AssertionError();
}
public static void speak(String message) {
System.out.println(message);
}
ถ้าตัวควบคุมการเข้าถึงของคอนสตรักเตอร์เริ่มต้นเป็น private จะไม่สามารถเข้าถึงได้จากภายนอกคลาส นอกจากนี้ยังบล็อกการเรียก คอนสตรักเตอร์เริ่มต้นภายในโดยการโยนข้อยกเว้น
คอนสตรักเตอร์แบบ private นี้อาจทำให้ผู้ใช้ไม่เข้าใจคอนสตรักเตอร์ ดังนั้นจึงเป็นการดีที่จะใส่ความคิดเห็น การบล็อกคอนสตรักเตอร์ ด้วย private จะมีผลต่อการทำให้การสืบทอดเป็นไปไม่ได้ด้วย
แหล่งที่มา
- Java ที่มีประสิทธิภาพ
- https://catsbi.oopy.io/d7f3a636-b613-453b-91c7-655d71fda2b1