Как это " возражает.новая " работа? (Есть ли у Java оператор. new?)
я наткнулся на этот код сегодня во время чтения ускоренный 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?
3 ответа:
они внутренний (вложенные нестатические) классы:
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
поскольку они, как правило, являются деталями реализации и аккуратным способом инкапсуляции части проблемы без загрязнения публичного пространства имен.
BookListUpdaterCallback
иStoreOrderCallback
являются внутренними классами книжного магазина.Посмотреть Учебном Руководстве По Java - http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html и http://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html