2010-09-10 17 views
21

In Java, il modo standard per creare un oggetto sta usandonuovo oggetto {} Costruire

MyClass name = new MyClass(); 

ho anche spesso di vedere il costrutto

new MyClass() { /*stuff goes in here*/ }; 

Ho cercato online per un po 'e non riesco a trovare una buona spiegazione di ciò che fa il secondo stile costruttivo o come lo fa.

Qualcuno può spiegare come e perché si utilizzerà il secondo costrutto?

+0

Solo una cosa: considera l'uso di 'Object' come segnaposto per il nome di classe fittizio, perché' Classe' è il nome di una classe stessa! È piuttosto raro estendere la classe 'Class', soprattutto anonimamente! –

risposta

19

Questo costrutto rende in realtà due cose: 1) Dichiara una classe anonima che estende la classe che usi nel costruttore e 2) crea un'istanza di questa classe anonima.

Modifica: quando si utilizza un tale costrutto è possibile osservare la classe anonima guardando i file .class generati. Esiste il normale file MyClass.class e un altro per ogni sottoclasse anonima: MyClass$1.class per il primo e così via.

+0

Quindi sarebbe utile per gli oggetti che userete? Ad esempio, oggetti che inseriresti immediatamente in un array? – andrewheins

+1

Il mio caso d'uso principale sarebbe per un'implementazione di un'interfaccia semplice (solo un metodo) o per personalizzare un adattatore (ad esempio java.awt.event. Un altro caso d'uso è fornito da @ Nathan-Hughes. Regola semplice: esegui solo le cose più semplici in una classe anonima e utilizza sottoclassi/classi per il resto – ZeissS

+0

Ciò aiuta, grazie. – andrewheins

3

La seconda costruzione crea un'istanza di classe anonima che è una sottoclasse di Class.

7

Come altri hanno già detto, crea un'istanza di una classe anonima, sottoclasse Class. Ecco un esempio di come è comunemente utilizzato:

panel.addMouseListener(
    new MouseAdapter() { 
    @Override 
    public void mouseEntered(MouseEvent e) { 
     System.out.println(e.toString()); 
    } 
    } 
); 

Il codice precedente crea un'istanza di una classe anonima che si estende MouseAdapter. Nella classe anonima il metodo mouseEntered è stato sovrascritto per dimostrare che la classe anonima funziona fondamentalmente come qualsiasi altra classe. Questo è un modo molto conveniente e comune per creare listener (di solito semplici).

+0

Come creare la classe MouseAdapter in questo caso? – CodeShadow

12

Si utilizzerà il secondo costrutto nel caso in cui si desideri creare una classe anonima. se si dispone di un metodo che accetta un callback come argomento, è possibile specificare l'implementazione del callback in linea anziché assegnargli un nome e inserirlo in un file separato o dichiararlo altrove nello stesso file.

C'è anche un trucco chiamato double brace initialization dove si può andare in giro non avendo la sintassi per le mappe e le liste letterali utilizzando classi anonime, come questo:

Map map = new HashMap() {{put("foo", 1); put("bar", 2);}}; 

Qui le parentesi annidate creano un inizializzatore esempio. L'oggetto associato alla mappa non è una HashMap, la sua classe è una classe anonima che estende HashMap. (Ciò significa che se hai una regola PMD sulle classi che devono dichiarare gli UID seriali allora si lamenterà di questo.)

Problemi correlati