How does "object.new" work? (Does Java have a .new operator?)

JavaSyntaxInner Classes

Java Problem Overview


I came across this code today whilst reading Accelerated GWT (Gupta) - page 151.

public static void getListOfBooks(String category, BookStore bookStore) {
    serviceInstance.getBooks(category, bookStore.new BookListUpdaterCallback());
}
public static void storeOrder(List books, String userName, BookStore bookStore) {
    serviceInstance.storeOrder(books, userName,    bookStore.new StoreOrderCallback());
}

What are those new operators doing there? I've never seen such syntax, can anyone explain?

Does anyone know where to find this in the java spec?

Java Solutions


Solution 1 - Java

They're inner (nested non-static) classes:

public class Outer {
  public class Inner { public void foo() { ... } }
}

You can do:

Outer outer = new Outer();
outer.new Inner().foo();

or simply:

new Outer().new Inner().foo();

The reason for this is that Inner has a reference to a specific instance of the outer class. Let me give you a more detailed example of this:

public class Outer {
  private final String message;

  Outer(String message) {
    this.message = message;
  }

  public class Inner {
    private final String message;

    public Inner(String message) {
       this.message = message;
    }

    public void foo() {
      System.out.printf("%s %s%n", Outer.this.message, message);
    }
  }
}

and run:

new Outer("Hello").new Inner("World").foo();

Outputs:

Hello World

Note: nested classes can be static too. If so, they have no implicit this reference to the outer class:

public class Outer {
  public static class Nested {
    public void foo() { System.out.println("Foo"); }
  }
}

new Outer.Nested.foo();

More often than not, static nested classes are private as they tend to be implementation details and a neat way of encapsulating part of a problem without polluting the public namespace.

Solution 2 - Java

Solution 3 - Java

I haven't seen this syntax before either, but I think it will create an inner class of BookStore.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionchickeninabiscuitView Question on Stackoverflow
Solution 1 - JavacletusView Answer on Stackoverflow
Solution 2 - JavaGreg CaseView Answer on Stackoverflow
Solution 3 - JavatangensView Answer on Stackoverflow