2013-09-02 22 views
14

ad esempio:"new Foo() {}" contro "new Foo()" in Java

Object o1 = new ArrayList<String>(); 
Object o2 = new ArrayList<String>(){}; 
Object o3 = new ArrayList<String>(){{}}; 

qual è la differenza?

Non riesco a google il 2 °/3 ° grammer di Java, qualsiasi riferimento?

+2

possibile duplicato di [Intervista: è possibile creare un'istanza di classe astratta?] (Http://stackoverflow.com/questions/13670991/interview-can-we-ststantiate-abstract-class) –

+0

Il terzo sta dichiarando un blocco di inizializzazione dell'istanza della classe anonima. –

+1

Re: il terzo, http://www.c2.com/cgi/wiki?DoubleBraceInitialization –

risposta

25

Il primo crea un ArrayList

Il secondo crea una sottoclasse anonima di ArrayList che ha un tipo generico specifico di stringa

Il terzo è lo stesso ma ha un blocco di inizializzazione che è vuoto.

Nota: se possibile, dovresti scrivere il codice più semplice e chiaro che puoi, specialmente se stai pensando alle prestazioni.

+1

+1 semplice e conciso :) – nachokk

+4

Penso che dovresti aggiungere "a meno che non ci sia un commento dettagliato che spiega che c'è qualche strana necessità speciale per una classe anonima di eludere la riflessione, il 2 ° e il 3 ° caso sono semplicemente stupidi, confusi e sbagliato." – user949300

+1

Aggiungo che [JMock] (http://www.jmock.org) usa il terzo stile per le sue creazioni di sottoclasse e codifica delle aspettative. – ArtB

13
Object o1 = new ArrayList<String>(); 

Crea un elenco di array.

Object o2 = new ArrayList<String>(){}; 

Qui si sta creando un classe anonima che si estende ArrayList<String> e non ignorare nulla. Quindi la differenza è che si sta sottoclasse un ArrayList senza un comportamento eccessivo, non farlo mai se non si ha una buona ragione.

Object o3 = new ArrayList<String>(){{}}; 

Si sta creando lo stesso di 2 ma con un blocco di initalizzatore vuoto.

+0

grazie! fatto. forse il secondo è utile per evitare la "cancellazione di tipo"? – marstone

+2

@marstone. No, questo non è l'uso. La cancellazione del tipo non può essere evitata. –

+0

@RohitJain in caso contrario, come potrebbe google gson mantenere il tipo di parametro generico utilizzando "new TypeToken >() {} .getType()"? scusa se questo è fuori tema. – marstone

0

Si sta istanziando in modo anonimo un corso. È possibile sovrascrivere i metodi nel caso successivo senza dover definire una nuova classe in un proprio file.

0

o3 è ancora un'istanza di una sottoclasse anonima di ArrayList che ha un blocco di inizializzazione un'istanza vuota (l'interno {}).

0
// Instantiate an object of type `ArrayList<String>` 
Object o1 = new ArrayList<String>(); 

// Instantiate an anonymous subclass of `ArrayList<String>` 
Object o2 = new ArrayList<String>(){}; 

// Instantiate an anonymous subclass of `ArrayList<String>` with an empty initializer block 
Object o3 = new ArrayList<String>(){{}}; 
0

Object o2 = new ArrayList<String>(){};
spetta annonymous classe interna che si estende ArrayList classe ed esclude nulla.
Object o2 = new ArrayList<String>(){{}};
è anche annonymous classe interna che si estende ArrayList classe e sovrascrive altro che ha un empty instance block.

2
Object o1 = new ArrayList<String>(); 

La creazione di un nuovo oggetto ArrayList e assegnandolo alla o1

Object o2 = new ArrayList<String>(){}; 

Creazione di una nuova istanza di una classe anonima che si estende ArrayList e assegnandolo alla o2

Object o3 = new ArrayList<String>(){{}}; 

Creazione di un nuovo istanza di una classe anonima (diversa da o2) che estende ArrayList che ha un inizializzatore dell'istanza no-op.

Funzionalmente le classi anon assegnate a o2 e o3 sono equivalenti ma tecnicamente saranno classi diverse.

Problemi correlati