هل هناك أي ضمانات في JLS حول ترتيب كتل التهيئة الثابتة؟

StackOverflow https://stackoverflow.com/questions/3028219

  •  26-09-2019
  •  | 
  •  

سؤال

أتساءل عما إذا كان من الموثوق استخدام البناء مثل:

private static final Map<String, String> engMessages;
private static final Map<String, String> rusMessages;

static {
    engMessages = new HashMap<String, String> () {{
        put ("msgname", "value");
    }};
    rusMessages = new HashMap<String, String> () {{
        put ("msgname", "значение");
    }};
}

private static Map<String, String> msgSource;

static {
    msgSource = engMessages;
}

public static String msg (String msgName) {
    return msgSource.get (msgName);
}

هل هناك احتمال أن أحصل عليه NullPointerException لان msgSource سيتم تنفيذ كتلة التهيئة قبل الكتلة التي تهيئة engMessages?

(حول لماذا لا أفعل msgSource التهيئة في نهاية init العلوي. كتلة: مجرد مسألة الذوق ؛ سأفعل ذلك إذا كان البناء الموصوف غير موثوق به)

هل كانت مفيدة؟

المحلول

نعم ، يتم تضمين كتل التهيئة الثابتة للتنفيذ بالترتيب النصي.

من JLS ، القسم 12.4.1:

القصد من ذلك هو أن فئة أو نوع واجهة لها مجموعة من المهيئات التي وضعتها في حالة متسقة ، وأن هذه الحالة هي أول حالة لوحظها فئات أخرى. يتم تنفيذ المهيمنات الثابتة والمهيئات المتغيرة للفئة بترتيب نصي, ، ولا يجوز للتشير إلى متغيرات الفئة المعلنة في الفصل الذي تظهر إعلاناته بشكل نصي بعد الاستخدام ، على الرغم من أن هذه المتغيرات الفئة في النطاق (الفقرة 8.3.3). تم تصميم هذا التقييد لاكتشاف ، في وقت الترجمة ، أكثر تهيئات دائرية أو مشوهة بطريقة أخرى.

و من 12.4.2:

بعد ذلك ، قم بتنفيذ إما المهيمنات المتغيرة للفئة والمهيئات الثابتة للفئة ، أو مُهيئات الحقل للواجهة ، بالترتيب النصي, ، كما لو كانوا كتلة واحدة.

شخصيا ، رغم ذلك ، سأضع جميع الإعلانات المتغيرة في البداية ، ثم كتلة تهيئة ثابتة واحدة. أنا أعتبر ذلك أسهل بكثير في المتابعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top