عند كتابة البرامج ، غالبًا ما تحتاج إلى استخدام وظيفة سجل الطباعة ، والتي يمكن أن تساعدك على تصحيح المشكلة وتأثيرها. لكن طريقة java الأصلية.
لماذا يتم رفض System.out.println () ، وهو قطعة أثرية مبتدئ لـ Java ، في تطوير المشروع الحقيقي؟ في الواقع ، طالما قمت بتحليلها بعناية ، ستجد العديد من عيوبه. على سبيل المثال ، إذا لم يتم التحكم فيها ، فسيتم طباعة جميع السجلات كالمعتاد بعد إطلاق المشروع ، مما يقلل من كفاءة التشغيل ؛ أنت تميز أي فئة يتم طباعة هذا السجل.
زعيمك ليس أحمق. ومع ذلك ، فإن قائدك جيد جدًا ، ولا يسمح لك بتحقيق أداة سجل Niubi مع وظائف مختلفة في البداية.
هذا الطلب ليس صعبًا بالنسبة لك.
الطبقة العامة logutil {public into int System.out.println (msg) ؛}} معلومات الفراغ العامة (سلسلة msg) {if (info> = المستوى) {system.out.println (msg) ؛}}}
اطبع السجل من خلال هذه الفئة ، وتحتاج فقط إلى التحكم في مستوى المستوى للتحكم بحرية في محتوى الطباعة. على سبيل المثال ، أصبح المشروع الآن في مرحلة التطوير ، ويتم تعيين المستوى على التصحيح ، بحيث تتم طباعة جميع معلومات السجل. إذا كان المشروع متصلاً بالإنترنت ، فيمكنك تعيين المستوى على المعلومات ، بحيث يمكنك فقط رؤية السجل والطباعة السجل أعلاه. إذا كنت تريد فقط رؤية السجل الخاطئ ، فيمكنك تعيين المستوى على الخطأ. وإذا كان المشروع الذي تطوره هو إصدار عميل ، فأنت لا ترغب في طباعة أي سجل ، فيمكنك تعيين المستوى على أي شيء. تحتاج فقط إلى الاتصال عند الطباعة:
New Logutil ().
لا يمكنك الانتظار لتقديم هذه الأداة إلى قائدك.
لكن الأمر لم يستغرق وقتًا طويلاً حتى يجدك زعيمك لتقديم ملاحظات. قال إنه على الرغم من أن هذه الأداة سهلة الاستخدام ، إلا أنها لا تميز بين مثل هذه الأشياء. لاستخدامه لاستخدامه.
هل تعتقد أن قائدك معقول للغاية ، وأنت تحاول الاستفادة من هذه الفرصة لممارسة وضع التصميم ، لذلك كتبت الكود التالي (PS: الكود هنا يتم ذلك بنفسي ، ولم أكن قد اهتمت به لم تنتبه.
الطبقة العامة logutil {private static logutilin getInStance () {if (loguTilinStance == null) {loguTilinStance = new logutil () ؛} return logutilinstance ؛} public void debug (string g. } معلومات الفراغ العامة (سلسلة msg) {if (info> = المستوى) {system.out.println (msg) ؛} خطأ باطل عام (سلسلة msg) {if (error> = level) {system .out ))
بادئ ذي بدء ، يتم خصخصة مُنشئ LoguTil ، بحيث لا يمكن استخدام الكلمة الرئيسية الجديدة لإنشاء مثيل LoguTil. ثم استخدم متغيرًا ثابتًا في SloguTil لحفظ المثيل ، وتوفير طريقة getInstance العامة للحصول على مثيل LoguTil. slogutil مباشرة. هذا يمكن أن يضمن أنه لن يكون هناك سوى مثيل LoguTil في الذاكرة. تم الانتهاء من الوضع المفرد! في هذا الوقت ، يجب تغيير رمز سجل الطباعة إلى الطريقة التالية:
logutil.getInstance ().
أنت تعرض هذا الإصدار لزعيمك.
أنت مليء بالشك ، أليس وضع مثال واحد يحقق مثل هذا؟ ماذا يمكن أن يكون خطأ؟
يطالبك زعيمك بأن استخدام وضع الفردي هو جعل هذه الفئة لديها مثيل واحد فقط في الذاكرة ، ولكن هل تفكر في موقف سجلات الطباعة في الفرات المتعددة؟ كما هو موضح في الكود التالي:
public static logutil getInstance () {if (loguTilinstance == null) {loguTilinStance = new logutil () ؛} return logutilinstance ؛}
إذا كان هناك موضوعان في نفس الوقت الذي يقوم فيه بتنفيذ طريقة getInstance في نفس الوقت ، فإن الخيط الأول ينفذ السطر الثاني ولم ينفذ السطر الثالث بعد. وبهذه الطريقة ، فشل وضع الفردي الخاص بك لأنه يتم إنشاء حالتين مختلفتين.
أنت تدرك فجأة ، لكن تفكيرك سريع للغاية ، وتفكر على الفور في الحل.
logutil getInstance () {if (logUtilinstance == null) {loguTilinstance = new logutil () ؛} إرجاع logutilinstance ؛}
وبهذه الطريقة ، يُسمح لخيط واحد فقط بتنفيذ الكود في GetInstance في نفس الوقت ، والذي يحل الموقف بشكل فعال حيث ستنشئ حالتان أعلاه.
يقرأ زعيمك الكود الجديد وقال: "حسنًا ، نعم. هذا يحل الموقف الذي قد يخلق حالتين ، لكن هذا الرمز لا يزال يمثل مشكلة."
أنت عصبي ، لماذا هناك أي مشاكل؟
ابتسم قائدك: "لا تكن متوترة ، هذه المرة ليست خطأ ، ولكن يمكن تحسينها من حيث الأداء. انظر ، إذا قمت بإضافة طريقة متزامنة إلى طريقة getInstance ، ثم في كل مرة أذهب فيها إلى GetInstace الطريقة ، سوف تتم مزامنتها.
أولاً ، قم بإزالة الكلمة الرئيسية المتزامنة من عبارة METRANT ، وأضفها إلى هيكل الطريقة:
logutil static public getInstance () {if (loguTilinstance == null) {synchronized (loguTil.class) {if (logutilinstance == null) {// قد يكون ذلك ضروريًا لأنه قد يتم إرفاق العمليتين في نفس الوقت في نفس الوقت الوقت في نفس الوقت.
بعد تغيير الرمز إلى هذا ، سيتم إدخال السطر الثالث عند عدم تهيئة slogutil ، ثم إضافة القفل المتزامن. بمجرد تهيئة Slogutil ، لن يذهب إلى السطر الثالث ، بحيث لن تتأثر طريقة GetInstance بأقفال المزامنة ، وسيتم تحسين الكفاءة إلى حد ما.
لا يمكنك إلا أن تعجب.
أصبح قائدك على الفور متواضعًا: "تسمى هذه الطريقة قفل التحقق المزدوج ، لكنني لا أفكر في الأمر. يمكنك التحقق من مزيد من المعلومات على الإنترنت."
في الواقع ، أنا معتاد أكثر على استخدام وضع الرجل الجائع في جافا
سمة من سمات طراز كسول تأخر التحميل.
تتمثل خاصية نمط هان الجياع في أنه يتم تحميله في البداية ، بحيث يمكنك العودة مباشرة عند استخدامه (أوصي بهذا الأمر ، لأنه لا توجد حاجة للنظر في العديد من مشكلات أمان الخيوط. بالطبع الأقفال المزدوجة ذكر لحل مشكلة التزامن)
رمز تنفيذ سجلات السجل مع نمط HANGRY HAN هو كما يلي:
الطبقة العامة logutil {private static logutilinstance = new logutil () ؛ () {} public static loguTil getInstance () {return logutilinstance ؛} debug public void (سلسلة msg) {if (debug> = level) {system.out.print ln (msg) ؛}} معلومات الفراغ العامة (سلسلة msg) {if (info> = level) {system.out.println (msg) ؛}} public void error (string msg) {if (error> = level) {system.out.println (msg) ؛} public atic void main main (String [] Art) {logutil.getInstance ().