2010-05-19 10 views
60

Natknąłem się na ten kod dzisiaj, czytając Accelerated GWT (Gupta) - page 151.Jak działa "object.new"? (Czy Java ma operatora .new?)

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

Co robią tamci nowi operatorzy? Nigdy nie widziałem takiej składni, czy ktoś może wyjaśnić?

Czy ktoś wie, gdzie to znaleźć w specyfikacji java?

+12

+1 dla składni Javy nigdy dotąd albo. –

+1

Wiedziałem o klasach wewnętrznych, ale używam ich, aby utworzyć je jako: 'new outer.SomeClass()' – OscarRyz

+0

Oscar, której składnia służy do tworzenia nowej statycznej klasy wewnętrznej. –

Odpowiedz

59

wewnętrzne (zagnieżdżone non-statyczne) klasy:

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

można zrobić:

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

lub po prostu:

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

Powodem tego jest to, że Inner ma odniesienie do określonego wystąpienia th e klasa zewnętrzna. Podam dokładniejszy przykład w ten sposób:

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

i uruchom:

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

Wyjścia:

Hello World 

Uwaga: Klasy zagnieżdżone mogą być static też. Jeśli tak, nie mają niejawny this odniesienie do zewnętrznej klasy:

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

new Outer.Nested.foo(); 

Częściej niż nie, statyczne klasy zagnieżdżone są private ponieważ wydają się być dane wdrożeniowe i schludny sposób enkapsulacji część problemu bez zanieczyszczających publiczny obszar nazw.

+0

Ah Widzę - dzięki! –

+1

Wszystko to jest napisane tutaj, jeśli ktoś jest zamroczony: http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html –

+0

, a także dobra dyskusja tutaj: http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class –

2

Jeszcze nie widziałem tej składni, ale myślę, że stworzy wewnętrzną klasę BookStore.