هل هناك أي ضمانات في JLS حول ترتيب كتل التهيئة الثابتة؟
-
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:
بعد ذلك ، قم بتنفيذ إما المهيمنات المتغيرة للفئة والمهيئات الثابتة للفئة ، أو مُهيئات الحقل للواجهة ، بالترتيب النصي, ، كما لو كانوا كتلة واحدة.
شخصيا ، رغم ذلك ، سأضع جميع الإعلانات المتغيرة في البداية ، ثم كتلة تهيئة ثابتة واحدة. أنا أعتبر ذلك أسهل بكثير في المتابعة.