PUBLIC OBJECT

Future Guice: injecting inner classes

As previously mentioned, I'm cataloging the differences in Guice since 1.0.

This test passes in Guice 1.0, but how it does so is surprising:

public class InjectTest extends TestCase {
  public void testFoo() {
    Foo foo = Guice.createInjector().getInstance(InnerFoo.class)
  }

  class InnerFoo implements Foo {
    @Inject InnerFoo() {}
  }
}

The problem is that the InnerFoo inner class is not marked static. Therefore each instance of InnerFoo has an implicit, invisible reference to its containing class, InjectTest. When it creates an instance of InnerFoo, Guice 1.0 will also build a new InjectTest, using its default constructor. This is weird! The outer-class instance is only reachable via the implicit reference, which is awkward and unexpected.

The latest snapshots of Guice refuse to construct non-static inner classes. This will help to find bugs! And for the rare situation where non-static is desired, Providers can be used. Plus they make the choice of containing instance explicit.