যখন উচ্চ-যুগল একক শ্রেণীর ইউনিট পরীক্ষার সাথে জড়িত হয়েছি তখন আমি নিম্নলিখিত অদ্ভুত আচরণের উপর হোঁচট খেয়েছি (জেডিকে 1.8.0_162 তে পরীক্ষা করা):
private static class SingletonClass {
static final SingletonClass INSTANCE = new SingletonClass(0);
final int value;
static SingletonClass getInstance() {
return INSTANCE;
}
SingletonClass(int value) {
this.value = value;
}
}
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
System.out.println(SingletonClass.getInstance().value); // 0
// Change the instance to a new one with value 1
setSingletonInstance(new SingletonClass(1));
System.out.println(SingletonClass.getInstance().value); // 1
// Call getInstance() enough times to trigger JIT optimizations
for(int i=0;i<100_000;++i){
SingletonClass.getInstance();
}
System.out.println(SingletonClass.getInstance().value); // 1
setSingletonInstance(new SingletonClass(2));
System.out.println(SingletonClass.INSTANCE.value); // 2
System.out.println(SingletonClass.getInstance().value); // 1 (2 expected)
}
private static void setSingletonInstance(SingletonClass newInstance) throws NoSuchFieldException, IllegalAccessException {
// Get the INSTANCE field and make it accessible
Field field = SingletonClass.class.getDeclaredField("INSTANCE");
field.setAccessible(true);
// Remove the final modifier
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
// Set new value
field.set(null, newInstance);
}
মূল () পদ্ধতির শেষ 2 টি লাইন ইনস্ট্যান্সের মূল্যের সাথে একমত নয় - আমার ধারণা হ'ল ক্ষেত্রটি স্থির চূড়ান্ত হওয়ায় জেআইটি পদ্ধতিটি পুরোপুরি মুক্তি পেয়েছে। চূড়ান্ত কীওয়ার্ড অপসারণ কোড আউটপুটকে সঠিক মান করে।
সিঙ্গেলনের প্রতি আপনার সহানুভূতি (বা এর অভাব) বাদ দেওয়া এবং এক মিনিটের জন্য ভুলে যাওয়া যে এরকম প্রতিচ্ছবি ব্যবহার করা সমস্যার জন্য জিজ্ঞাসা করছে - জেআইটি অপটিমাইজেশনে দোষী হওয়ার জন্য কি আমার এই ধারণাটি সঠিক? যদি তাই হয় - সেগুলি কি কেবল স্থির চূড়ান্ত ক্ষেত্রের মধ্যে সীমাবদ্ধ?
static final
ক্ষেত্র সহ একটি ক্লাস রয়েছে । তদুপরি, এই প্রতিফলন হ্যাকটি জেআইটি বা একমত হওয়ার কারণে ভেঙে গেছে কিনা তা বিবেচ্য নয়।