-
إذا كنت تعرف بالفعل ما سأكتب عنه عندما ترى العنوان، فيبدو أن مهاراتك لا تزال أفضل من مهاراتي، وإذا كنت في حيرة من أمرك، فما عليك سوى القراءة بعناية.
اسمحوا لي أولاً أن أكتب نمطًا مفردًا:
عرض نسخة عادية إلى الحافظة؟
اختبار الحزمة. يعكس؛
الطبقة العامة سينجلتون {
مفردة ثابتة خاصة = فارغة ؛
سينجلتون خاص () {
}
public static Singleton getInstance() {
إذا (ق == فارغة) {
متزامن (Singleton.class) {
إذا (ق == فارغة) {
s = new Singleton();
}
}
}
العودة ق.
}
}
اختبار الحزمة. يعكس؛
الطبقة العامة سينجلتون {
مفردة ثابتة خاصة = فارغة ؛
سينجلتون خاص () {
}
public static Singleton getInstance() {
إذا (ق == فارغة) {
متزامن (Singleton.class) {
إذا (ق == فارغة) {
s = new Singleton();
}
}
}
العودة ق.
}
}
فئة Singleton هذه هي نموذج مثيل واحد، ويتم تعديل طريقة البناء الخاصة بها بشكل خاص إنشاء مثيلات زائدة عن الحاجة.
عميلنا هو كما يلي:
عرض نسخة عادية إلى الحافظة؟
Singleton Singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();هذا لا يعمل
Singleton Singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();هذا لا يعمل
نتيجة الطباعة هي كما يلي:
عرض نسخة عادية إلى الحافظة؟
test.reflect.Singleton@c17164
test.reflect.Singleton@c17164
ولكن كيف يمكننا إنشاء مثيل من خلال المنشئ الخاص؟ الجواب هو الانعكاس.
تعد لغة Java العاكسة وحدة مهمة لفهم الانعكاس. المبدأ الأساسي للانعكاس هو تعيين الرمز الثانوي للفئة إلى كائن فئة يمكنه وصف معلومات مختلفة حول الفئة.
أدناه سنضيف بعض التعليمات البرمجية من جانب العميل:
عرض نسخة عادية إلى الحافظة؟
Singleton Singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();هذا لا يعمل
Class<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");// يعمل هذا أيضًا
Constructor<?>[] buildors = clazz.getDeclaredConstructors();// احصل على المنشئ المعلن
Constructor<?> publicConstructor = buildors[0];// تحتوي فئة Singleton على مُنشئ واحد فقط
PrivateConstructor.setAccessible(true);// قم بتعيين الوصول إلى true لتشغيله
مثيل Singleton = (Singleton) PrivateConstructor.newInstance();
System.out.println(instance);
System.out.println(singleton == مثيل);
Singleton Singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();هذا لا يعمل
Class<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");// يعمل هذا أيضًا
Constructor<?>[] buildors = clazz.getDeclaredConstructors();// احصل على المنشئ المعلن
Constructor<?> publicConstructor = buildors[0];// تحتوي فئة Singleton على مُنشئ واحد فقط
PrivateConstructor.setAccessible(true);// قم بتعيين الوصول إلى true لتشغيله
مثيل Singleton = (Singleton) PrivateConstructor.newInstance();
System.out.println(instance);
System.out.println(singleton == مثيل);
النتيجة المطبوعة هي:
عرض نسخة عادية إلى الحافظة؟
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.
-