web-dev-qa-db-ja.com

「object.new」はどのように機能しますか? (Javaに.new演算子がありますか?)

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());
}

そこで新しいオペレーターは何をしていますか?私はそのような構文を見たことがありません、誰でも説明できますか?

Java仕様でこれをどこに見つけるか知っていますか?

66

それらはinner(ネストされた非静的)クラスです:

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

できるよ:

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

または単に:

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

これは、Innerに外部クラスの特定のインスタンスへの参照があるためです。この詳細な例を挙げましょう。

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);
    }
  }
}

そして実行:

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

出力:

Hello World

注:ネストされたクラスもstaticにすることができます。その場合、外部クラスへの暗黙のthis参照はありません。

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

new Outer.Nested.foo();

多くの場合、静的なネストされたクラスはprivateです。これらは実装の詳細であり、パブリック名前空間を汚染することなく問題の一部をカプセル化するための優れた方法である傾向があるためです。

63
cletus

BookListUpdaterCallbackおよびStoreOrderCallbackはBookStoreの内部クラスです。

Javaチュートリアル- http://docs.Oracle.com/javase/tutorial/Java/javaOO/nested.html および http:/ /docs.Oracle.com/javase/tutorial/Java/javaOO/innerclasses.html

4
Greg Case

この構文も以前に見たことがありませんが、BookStoreの内部クラスが作成されると思います。

1
tangens