[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