-
หากคุณรู้อยู่แล้วว่าฉันจะเขียนเกี่ยวกับอะไรเมื่อคุณเห็นชื่อเรื่อง ดูเหมือนว่าทักษะของคุณยังดีกว่าของฉัน หากคุณสับสน ให้อ่านอย่างละเอียด
ให้ฉันเขียนรูปแบบซิงเกิลก่อน:
ดู plaincopy ไปที่ clipboardprint หรือไม่
แพ็คเกจทดสอบสะท้อน;
คลาสสาธารณะซิงเกิลตัน {
ซิงเกิลตันคงที่ส่วนตัว s = null;
ซิงเกิลตันส่วนตัว () {
-
สาธารณะ Singleton getInstance () {
ถ้า (s == โมฆะ) {
ซิงโครไนซ์ (Singleton.class) {
ถ้า (s == โมฆะ) {
s = ซิงเกิลตันใหม่ ();
-
-
-
กลับ;
-
-
แพ็คเกจทดสอบสะท้อน;
คลาสสาธารณะซิงเกิลตัน {
ซิงเกิลตันคงที่ส่วนตัว s = null;
ซิงเกิลตันส่วนตัว () {
-
สาธารณะ Singleton getInstance () {
ถ้า (s == โมฆะ) {
ซิงโครไนซ์ (Singleton.class) {
ถ้า (s == โมฆะ) {
s = ซิงเกิลตันใหม่ ();
-
-
-
กลับ;
-
-
คลาส Singleton นี้เป็นโมเดลอินสแตนซ์เดียว และวิธีการสร้างคลาสภายนอกไม่สามารถสร้างอินสแตนซ์ผ่านอินสแตนซ์ใหม่ได้เท่านั้น สร้างอินสแตนซ์ที่ซ้ำซ้อน
ลูกค้าของเรามีดังนี้:
ดู plaincopy ไปที่ clipboardprint หรือไม่
ซิงเกิลตัน ซิงเกิลตัน = Singleton.getInstance();
System.out.println(ซิงเกิลตัน);
//singleton = new Singleton();สิ่งนี้ใช้ไม่ได้
ซิงเกิลตัน ซิงเกิลตัน = Singleton.getInstance();
System.out.println(ซิงเกิลตัน);
//singleton = new Singleton();สิ่งนี้ใช้ไม่ได้
ผลลัพธ์การพิมพ์จะเป็นดังนี้:
ดู plaincopy ไปที่ clipboardprint หรือไม่
test.reflect.Singleton@c17164
test.reflect.Singleton@c17164
แต่เราจะสร้างอินสแตนซ์ผ่านตัวสร้างส่วนตัวได้อย่างไร คำตอบคือการสะท้อนกลับ
การสะท้อนกลับของ Java เป็นโมดูลที่สำคัญ การทำความเข้าใจการสะท้อนกลับสามารถช่วยเราได้มาก หลักการพื้นฐานของการสะท้อนคือการแมปรหัสไบต์ของคลาสเข้ากับคลาสอ็อบเจ็กต์ที่สามารถอธิบายข้อมูลต่างๆ เกี่ยวกับคลาสได้
ด้านล่างเราจะเพิ่มโค้ดบางส่วนในฝั่งไคลเอ็นต์:
ดู plaincopy ไปที่ clipboardprint หรือไม่
ซิงเกิลตัน ซิงเกิลตัน = Singleton.getInstance();
System.out.println(ซิงเกิลตัน);
//singleton = new Singleton();สิ่งนี้ใช้ไม่ได้
คลาส<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//นี่ก็ใช้ได้เช่นกัน
Constructor<?>[] Constructors = clazz.getDeclaredConstructors();//รับ Constructor ที่ประกาศไว้
Constructor<?> privateConstructor = Constructors[0];//คลาส Singleton มี Constructor ตัวเดียวเท่านั้น
privateConstructor.setAccessible(true);//ตั้งค่าให้เข้าถึงได้จริงเพื่อใช้งาน
อินสแตนซ์ซิงเกิล = (ซิงเกิลตัน) privateConstructor.newInstance ();
System.out.println (อินสแตนซ์);
System.out.println (อินสแตนซ์ == เดี่ยว);
ซิงเกิลตัน ซิงเกิลตัน = Singleton.getInstance();
System.out.println(ซิงเกิลตัน);
//singleton = new Singleton();สิ่งนี้ใช้ไม่ได้
คลาส<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//นี่ก็ใช้ได้เช่นกัน
Constructor<?>[] Constructors = clazz.getDeclaredConstructors();//รับ Constructor ที่ประกาศไว้
Constructor<?> privateConstructor = Constructors[0];//คลาส Singleton มี Constructor ตัวเดียวเท่านั้น
privateConstructor.setAccessible(true);//ตั้งค่าให้เข้าถึงได้จริงเพื่อใช้งาน
อินสแตนซ์ซิงเกิล = (ซิงเกิลตัน) privateConstructor.newInstance ();
System.out.println (อินสแตนซ์);
System.out.println (อินสแตนซ์ == เดี่ยว);
ผลลัพธ์ที่พิมพ์ออกมาคือ:
ดู plaincopy ไปที่ clipboardprint หรือไม่
test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
เท็จ
test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
เท็จ
เราเห็นว่าวัตถุที่สร้างขึ้นสองครั้งนั้นแตกต่างกัน เราสร้างอินสแตนซ์ของคลาส Singleton ผ่านวิธีคอนสตรัคเตอร์ส่วนตัว
บทความนี้มาจากบล็อก CSDN โปรดระบุแหล่งที่มาเมื่อพิมพ์ซ้ำ: http://blog.csdn.net/liuhe688/archive/2009/12/31/5110637.aspx
-