[fedora-java] Is this specified somewhere?
Aaron Clark
ophidian at ophidian.homeip.net
Wed Oct 14 11:48:49 UTC 2009
On 14-Oct-09, at 6:22 AM, Christoph Höger wrote:
> Hi,
>
> I was just pointed to a strange thing in javas anonymous class
> features.
>
> Consider the following class:
>
> package javabug;
>
> public class NormalTestClass {
>
> final Integer i; //mark
>
> NormalTestClass() {
> i = 101; //mark
> foo();
> }
>
> public void foo() { }
> }
>
>
> When you create an anonyous class like
>
> final Integer i = 100;
>
> NormalTestClass myClass = new NormalTestClass() {
>
> @Override
> public void foo() {
> System.err.println(i);
> }
> };
>
> Instead of 100 the output would be 101.
> The problem is that we had discussed a case that used to occur in
> older
> versions of java when you removed the marked lines: In that case in
> the
> first call of foo() the variable i would not yet be initialised and
> therefore be null.
> This is fixed now. But what you get now is problematic on its own:
> Effectively you are forced into not using variables that are privately
> used by the superclass (you might not even know of).
>
> Any comments on this issue?
>
Actually, it makes perfect sense.
The first i is package scoped, not private, so it is visible to the
child class if it's in the same package, and the second i is at a
higher scope level than the anonymous class. Inside the anonymous
class definition, you're referencing the 'closest' scoped variable
with that name, which is the class variable rather than what it might
view as a global variable. If you moved the definition of the 100
inside the anonymous class, then your new foo() would reference it.
Aaron
--
"In the last, lorn fight
'gainst the fall of long night,
the mountains stand guard,
and the dead shall be ward,
for the grave is no bar to my call."
--The Horn Of Valere
More information about the fedora-devel-java-list
mailing list