2010-05-19 3 views
60

Je suis tombé sur ce code aujourd'hui en lisant Accelerated GWT (Gupta) - page 151.Comment fonctionne "object.new"? (Java a-t-il un opérateur .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()); 
} 

Que font ces nouveaux opérateurs? Je n'ai jamais vu une telle syntaxe, quelqu'un peut-il expliquer?

Est-ce que quelqu'un sait où trouver cela dans la java spec?

+12

+1 pour Java syntaxe que je ne l'ai jamais vu auparavant non plus. –

+1

Je connaissais les classes internes, mais je les utilise pour les créer comme: 'new outer.SomeClass()' – OscarRyz

+0

Oscar cette syntaxe sert à créer une nouvelle classe interne statique –

Répondre

59

Ils sont internes (imbriquées non statiques) classes:

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

Vous pouvez faire:

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

ou simplement:

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

La raison de cette est que Inner a une référence à une instance spécifique de La classe externe. Permettez-moi de vous donner un exemple plus détaillé de cette:

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

et exécutez:

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

Sorties:

Hello World 

Note: classes imbriquées peuvent être static aussi. Si oui, ils ont aucune référence this implicite à la classe externe:

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

new Outer.Nested.foo(); 

Plus souvent qu'autrement, les classes imbriquées statiques sont private car ils ont tendance à être les détails de mise en œuvre et une belle façon d'encapsuler une partie d'un problème sans polluer l'espace de noms public.

+0

Ah je vois - merci! –

+1

Tout est écrit ici si quelqu'un est flou sur ce sujet: http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html –

+0

et aussi une bonne discussion ici: http://stackoverflow.com/questions/70324/java-classe-interne-et-statique-classe-nested –

2

Je n'ai pas vu cette syntaxe avant non plus, mais je pense qu'il va créer une classe interne de BookStore.

Questions connexes