/ / संकलक आंतरिक वर्ग में एक गैर-अंतिम चर को क्यों स्वीकार कर रहा है? - जावा, Android, संकलक-त्रुटियों

क्यों संकलक आंतरिक कक्षा में एक गैर-अंतिम चर स्वीकार कर रहा है? - जावा, एंड्रॉइड, कंपाइलर-त्रुटियां

मैं एक मीडियापेयर की तलाश कर रहा हूँ। एमपी एक MediaPlayer ऑब्जेक्ट है और साधक मेनऐक्टिविटी क्लास में बनाई गई सीकर ऑब्जेक्ट है।

मेरी समझ यह है कि केवल अंतिम सदस्य अनाम आंतरिक वर्ग के लिए सुलभ हैं। फिर कैसे उन वस्तुओं तक पहुँच योग्य नहीं है(एमपी और साधक)।

     h = new Handler();  // create a handler for the MainActivity

//create a runnable activity to change the progress of seekbar in MainThread for every 1 sec
Runnable r = new Runnable() {
@Override
public void run() {
if (mp != null) {
seeker.setProgress(mp.getCurrentPosition() / 1000);
}
h.postDelayed(this, 1000);
}
};

this.runOnUiThread(r);

नोट: कोड पूरी तरह से काम करता है। मदद के लिए धन्यवाद।

उत्तर:

उत्तर № 1 के लिए 4

ऐसा होता है, कारण कुछ कहा जाता है प्रभावी रूप से अंतिम.

jls-8.1.3:

कोई भी स्थानीय चर, औपचारिक पैरामीटर, याअपवाद पैरामीटर का उपयोग किया जाता है, लेकिन एक आंतरिक वर्ग में घोषित नहीं किया जाना चाहिए या तो अंतिम रूप से घोषित किया जाना चाहिए या प्रभावी रूप से अंतिम (but4.12.4) होना चाहिए, या एक संकलन-समय त्रुटि होती है जहां उपयोग का प्रयास किया जाता है।

jls-4.12.4:

यदि एक चर प्रभावी रूप से अंतिम है, तो जोड़नाअपनी घोषणा के लिए अंतिम संशोधन किसी भी संकलन समय त्रुटियों का परिचय नहीं होगा। इसके विपरीत, एक स्थानीय चर या पैरामीटर जिसे एक वैध कार्यक्रम में अंतिम घोषित किया जाता है, यदि अंतिम संशोधक हटा दिया जाता है तो प्रभावी रूप से अंतिम हो जाता है।

जब चर केवल एक बार सेट किया जाता है और इसका उपयोग एक आंतरिक वर्ग में किया जाता है, तो संकलक चर के संशोधक को बदल देता है final.

इस कोड पर विचार करें Tests.java:

public class Tests  {
public static void main(String[] args) throws Throwable {
String value = "Hello";

Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(value);
}
};
}
}

ऊपर दिया गया कोड, जब संकलित किया जाता है, तो इस कोड को उत्पन्न करेगा। क्या आप देख सकते हैं कि कंपाइलर का संशोधक बदल गया है value अंतिम करने के लिए?

टेस्ट.क्लास (डिकोड):

public class Tests {
public Tests() {
}

public static void main(String[] args) throws Throwable {
final String value = "Hello";
Runnable var10000 = new Runnable() {
public void run() {
System.out.println(value);
}
};
}
}

लेकिन, यदि आप परिवर्तनशील का मान बदलते हैं (कोड बेलो देखें), तो यह "टी संकलित" होगा, क्योंकि कंपाइलर जानता है कि यह एक प्रभावी रूप से अंतिम चर नहीं है:

public class Tests  {
public static void main(String[] args) throws Throwable {
String value = "Hello";
value = "world";

Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(value);
}
};
}
}