Я столкнулся с этим кодом сегодня при чтении Ускоренного 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?
Это внутренние (вложенные нестатические) классы:
public class Outer {
public class Inner { public void foo() { ... } }
}
Вы можете сделать:
Outer outer = new Outer();
outer.new Inner().foo();
или просто:
new Outer().new Inner().foo();
Причина в том, что Внутренний
имеет ссылку на конкретный экземпляр внешнего класса. Позвольте мне привести более подробный пример этого:
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
Примечание: вложенные классы также могут быть статическими
. Если это так, у них нет неявной this
ссылки на внешний класс:
public class Outer {
public static class Nested {
public void foo() { System.out.println("Foo"); }
}
}
new Outer.Nested.foo();
Чаще всего статические вложенные классы частные
, поскольку они, как правило, являются деталями реализации и изящным способом инкапсуляции части проблемы без загрязнения общедоступного пространства имен.
BookListUpdaterCallback
и StoreOrderCallback
являются внутренними классами BookStore.
См. Руководство по Java - http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html и http://docs.oracle.com/javase /tutorial/java/javaOO/innerclasses.html
Я тоже не видел этого синтаксиса раньше, но думаю, что он создаст внутренний класс BookStore
.