java.util and anonymous class

Rémi Forax forax at univ-mlv.fr
Mon Dec 5 02:20:11 PST 2011


While removing generics warnings in java.util,
I've seen that some anonymous classes are coded in a way that
make javac to generate too much fields.

This code:
final List<String> list = Arrays.asList(args);
     Iterator<String> iterator = new Iterator<String>() {
       private Iterator<String> it = list.iterator();

       ...
       }
     };

generates an anonymous class with two fields:
final class Foo$1 implements java.util.Iterator<java.lang.String> {
   java.util.Iterator<java.lang.String> it;
   final java.util.List val$list;
   FinalCaptureTooBig$1(java.util.List);
...

while this code:
List<String> list = Arrays.asList(args);
     final Iterator<String> it = list.iterator();
     Iterator<String> iterator = new Iterator<String>() {
...

generates an anonymous class with only one field:
final class FinalCaptureTooBig$1 implements 
java.util.Iterator<java.lang.String> {
   final java.util.Iterator val$it;
   FinalCaptureTooBig$1(java.util.Iterator);
...

If javac was smart, it should generate only one field because the 
variable 'list' is only
use in the initializer of a field, so 'list' has to be passed as 
parameter of the constructor
but don't need to be stored as a field.

Note that this change in javac may break the serialization compatibility,
so may be it's not a good idea to change javac. Or we can say that we 
don't care
because there is an item in Effective Java that says that you should not use
an anonynous class.

Should we change the code of java.util or javac ?

cheers,
Rémi







More information about the compiler-dev mailing list