سؤال

دعنا نقول أن لدي فصل مثل هذا:

class ApplicationDefs{
public static final String configOption1 = "some option";
public static final String configOption2 = "some other option";
public static final String configOption3 = "yet another option";
}

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

هل هناك أي خيار لتعطيل وضع ثوابت وقت الترجمة؟

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

المحلول

يمكنك استخدام String.Intern () للحصول على التأثير المطلوب ، ولكن يجب التعليق على الكود الخاص بك ، لأنه لا يعرف الكثير من الناس عن هذا. بمعنى آخر

public static final String configOption1 = "some option".intern();

هذا سيمنع وقت الترجمة المضمّن. نظرًا لأنه يشير إلى نفس السلسلة التي سيضعها المترجم في PERM ، فأنت لا تنشئ أي شيء إضافي.

كبديل يمكنك القيام به دائمًا

public static final String configOption1 = "some option".toString();

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

يحرر:العثور على رابط آخر حتى يعطي إشارات إلى JLS ، لمزيد من المعلومات حول هذا.متى تستخدم Intern () على حرفية السلسلة

نصائح أخرى

لا ، إنه جزء من JLS ، أخشى. تم التطرق إلى ذلك لفترة وجيزة في Java Buzzlers لكن ليس لدي نسختي لتسليمها.

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

المرجعي: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313

لا ، يمكنك استبدالها بعنوان "استاتيكي" ، مثل:

class ApplicationDefs {

    public static String configOption1() { return "some option"; }

}

منحت ، إنها ليست جميلة ولكنها ستفي متطلباتك. قون

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

ومع ذلك ، يُقترح بشدة أنه إذا كان هذا بالفعل نوعًا من التكوين الذي تحاول القيام به ، فيجب عليك الانتقال إلى طريقة أكثر قابلية للإدارة من الثوابت في بعض ملفات الفصل.

يمكنك تثبيط ضمّن عن طريق جعل ثوابت الوقت المستمرة غير المستمرة ...

على سبيل المثال، null ليس ثابت وقت الترجمة. أي تعبير ينطوي على ثابت وقت غير مُجهز ليس ثابتًا لوقت الترجمة ، على الرغم من أن Javac قد تقوم بطي ثابت داخل وحدة التجميع.

public static final String configOption1 = null!=null?"": "some option";

لا يوجد شيء هنا يقول إن هذه القيم يجب أن تكون محصورة. أنت فقط تعلن بعض public, static أفراد. تستخدم تلك الفئات الأخرى قيم هؤلاء الأعضاء. لا يطلب أي مضمون. حتى ال final الكلمة الرئيسية

لكن ل أسباب الأداء, ، قد بعض jvms في النسق هذه القيم في تلك الفئات الأخرى. هذا هو التحسين. لا ينبغي أن يغير التحسين سلوك البرنامج. لذلك إذا قمت بتغيير تعريف هؤلاء الأعضاء ، فيجب على JVM un-inline القيم السابقة.

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

لست متأكدًا مما يحدث عند استيراد هذا الفصل بشكل ثابت. أعتقد (غير متأكد) أن يتم تنفيذ الإطار وقد يتسبب في المشكلة التي ذكرتها. إذا كان هذا هو الحال ، فيمكنك حذف الاستيراد الثابت بشكل أساسي وأنت على ما يرام.

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