70

今日、 Accelerated GWT(Gupta)を読んでいるときにこのコードに出くわしました-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仕様でこれを見つける場所を知っていますか?

4

3 に答える 3

66

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

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、実装の詳細であり、パブリック名前空間を汚染することなく問題の一部をカプセル化するための優れた方法である傾向があります。

于 2010-05-19T05:50:56.977 に答える
4

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

Javaチュートリアル-http : //docs.oracle.com/javase/tutorial/java/javaOO/nested.htmlおよびhttp://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.htmlを参照してください。

于 2010-05-19T05:51:03.640 に答える
1

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

于 2010-05-19T05:49:54.983 に答える