जैसा कि यहां हर किसी ने कहा है, स्थानीय चर को आंतरिक कक्षा द्वारा एक्सेस किया जाना अंतिम है।
यहाँ
है (मूल रूप से) ऐसा क्यों है ... यदि आप तल पर निम्नलिखित कोड (उत्तर है, लेकिन, लिखते हैं, आप प्राप्त कर सकते हैं लघु संस्करण :-):
class Main
{
private static interface Foo
{
void bar();
}
public static void main(String[] args)
{
final int x;
Foo foo;
x = 42;
foo = new Foo()
{
public void bar()
{
System.out.println(x);
}
};
foo.bar();
}
}
संकलक यह मोटे तौर पर तब्दील हो इस तरह:
class Main
{
private static interface Foo
{
void bar();
}
public static void main(String[] args)
{
final int x;
Foo foo;
x = 42;
class $1
implements Foo
{
public void bar()
{
System.out.println(x);
}
}
foo = new $1();
foo.bar();
}
}
और फिर इस:
class Main
{
private static interface Foo
{
void bar();
}
public static void main(String[] args)
{
final int x;
Foo foo;
x = 42;
foo = new $1(x);
foo.bar();
}
private static class $1
implements Foo
{
private final int x;
$1(int val)
{
x = val;
}
public void bar()
{
System.out.println(x);
}
}
}
और यह करने के लिए अंत में:
class Main
{
public static void main(String[] args)
{
final int x;
Main$Foo foo;
x = 42;
foo = new Main$1(x);
foo.bar();
}
}
interface Main$Foo
{
void bar();
}
class Main$1
implements Main$Foo
{
private final int x;
Main$1(int val)
{
x = val;
}
public void bar()
{
System.out.println(x);
}
}
महत्वपूर्ण यह वह जगह है जहां यह $ 1 को कन्स्ट्रक्टर जोड़ता है। कल्पना कीजिए कि अगर आप ऐसा कर सकता है:
class Main
{
private static interface Foo
{
void bar();
}
public static void main(String[] args)
{
int x;
Foo foo;
x = 42;
foo = new Foo()
{
public void bar()
{
System.out.println(x);
}
};
x = 1;
foo.bar();
}
}
आपको लगता है कि foo.bar() उम्मीद करेंगे बाहर 1 मुद्रित होगा लेकिन यह वास्तव में बाहर 42 प्रिंट होगा अंतिम इस भ्रामक स्थिति पैदा होती है नहीं कर सकते हैं होने के लिए स्थानीय चर की आवश्यकता द्वारा।
बहुत खराब जावा को यहां अंतिम आवश्यकता है। यह संकलक के लिए स्पष्ट है कि स्थानीय चर बदल नहीं है, इसे कोडर से इसकी पुष्टि करने के लिए नहीं कहना चाहिए। यदि एनन क्लास स्थानीय चर में लिखता है, तो संकलन चेतावनी पर्याप्त है। बुरा बुरा डिजाइन पसंद। – irreputable
संभावित डुप्लिकेट [अज्ञात वर्ग में केवल अंतिम चर उपलब्ध क्यों हैं?] (Http://stackoverflow.com/questions/4732544/why-are-only-final-variables-accessible-in-anonymous-class) – vaxquis