66 votes

Comment fonctionne "object.new" ? (Java possède-t-il un opérateur .new ?)

Je suis tombé sur ce code aujourd'hui en lisant GWT accéléré (Gupta) - page 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());
}

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

Quelqu'un sait-il où trouver cela dans la spécification java ?

63voto

cletus Points 276888

Ils sont intérieur (imbriquées et non statiques) :

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

Vous pouvez le faire :

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

ou simplement :

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

La raison en 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é :

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 courir :

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

Sorties :

Hello World

Note : les classes imbriquées peuvent être static aussi. Si c'est le cas, ils n'ont pas d'implicite this référence à la classe externe :

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

new Outer.Nested.foo();

Le plus souvent, les classes statiques imbriquées sont private car il s'agit généralement de détails d'implémentation et d'une bonne façon d'encapsuler une partie d'un problème sans polluer l'espace de noms public.

4voto

Greg Case Points 10300

BookListUpdaterCallback et StoreOrderCallback sont des classes internes de BookStore.

Voir le tutoriel Java - http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html et http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html

1voto

tangens Points 17733

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X