2010-05-19 11 views
60

Mi sono imbattuto in questo codice oggi mentre leggevo Accelerated GWT (Gupta) - page 151.Come funziona "object.new"? (Java ha un nuovo operatore?)

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

Cosa ci fanno questi nuovi operatori? Non ho mai visto una simile sintassi, qualcuno può spiegarlo?

Qualcuno sa dove trovarlo nella specifica Java?

+12

+1 per la sintassi di Java non ho mai visto prima che uno. –

+1

Sapevo di classi interne, ma io li uso per crearli come: 'new outer.SomeClass()' – OscarRyz

+0

Oscar che la sintassi è per la creazione di una nuova classe interna statica –

risposta

59

Sono interne classi (annidate non statici):

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

si può fare:

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

o semplicemente:

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

La ragione di questo è che Inner ha un riferimento a un'istanza specifica di th e classe esterna. Lasciate che vi faccia un esempio più dettagliato di questo:

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

ed eseguire:

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

Uscite:

Hello World 

Nota: classi annidate possono essere static troppo. Se è così, non hanno alcun implicita this riferimento alla classe esterna:

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

new Outer.Nested.foo(); 

Più spesso che no, classi annidate statiche sono private in quanto tendono ad essere i dettagli di implementazione e un modo pulito di incapsulare parte di un problema senza inquinare lo spazio dei nomi pubblico.

+0

Ah capisco - grazie! –

+1

È tutto scritto qui se qualcuno è confuso su questo: http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html –

+0

e anche una buona discussione qui: http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class –

2

Non ho ancora visto questa sintassi, ma penso creerà una classe interna di BookStore.

Problemi correlati