2013-09-02 15 views
14

na przykład:"new Foo() {}" w porównaniu z "new Foo()" w Javie

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

co za różnica?

Nie mogę wypuścić z Google drugiego/trzeciego grama java, żadnego odniesienia?

+2

możliwy duplikat [Wywiad: Czy możemy utworzyć instancję klasy abstrakcyjnej?] (Http://stackoverflow.com/questions/13670991/interview-can-we-instantiate-abstract-class) –

+0

Trzeci to deklarowanie bloku inicjalizatora instancji z anonimowej klasy. –

+1

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

Odpowiedz

25

Pierwszą tworzy ArrayList

Drugi tworzy anonimowe podklasy ArrayList, która ma specyficzny ogólny typ String

Trzeci jest taka sama, ale ma blok inicjująca, która jest pusta.

Uwaga: W miarę możliwości powinieneś napisać najprostszy i najczystszy kod, szczególnie jeśli myślisz o wydajności.

+1

+1 proste i zwięzłe :) – nachokk

+4

Myślę, że powinieneś dodać "chyba, że ​​istnieje szczegółowy komentarz wyjaśniający, że istnieje dziwna specjalna potrzeba, aby anonimowa klasa obchodziła refleksje, a drugi i trzeci przypadek są po prostu głupie, mylące i źle." – user949300

+1

Dodam, że [JMock] (http://www.jmock.org) używa trzeciego stylu, aby kpić z podklasy i kodować oczekiwania. – ArtB

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

Tworzy ArrayList.

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

Tutaj tworzysz anonimową klasę który rozciąga ArrayList<String> i niczego nie zastępują. Więc różnica polega na tym, że podklasujesz tablicę ArrayList bez przesadnego zachowania, Nigdy nie rób tego, jeśli nie masz dobrego powodu,.

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

Tworzysz to samo co 2, ale z pustym blokiem initalizera.

+0

dzięki! Rozumiem. może drugi jest przydatny, aby uniknąć "wymazywania typu"? – marstone

+2

@marstone. Nie, to nie jest użytek. Nie można uniknąć typu wymazania. –

+0

@RohitJain jeśli nie, w jaki sposób Google gson może zachować typowy typ parametru za pomocą "new TypeToken >() {} .getType()"? Przepraszam, jeśli to nie dotyczy tematu. – marstone

0

Anonimowo tworzysz klasę. Można zastąpić metody w późniejszym przypadku bez potrzeby definiowania nowej klasy we własnym pliku.

0

o3 jest nadal instancją anonimowej podklasy ArrayList, która ma pusty blok inicjowania instancji (wewnętrzna {}).

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>(){};
to annonymous klasa wewnętrzna który rozciąga ArrayList klasę i nadpisuje nic.
Object o2 = new ArrayList<String>(){{}};
jest również annonymous klasa wewnętrzna który rozciąga ArrayList klasę i nadpisuje nic, ale ma empty instance block.

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

Tworzenie nowego obiektu ArrayList i przypisanie go do o1

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

Tworzenie nowej instancji anonimowej klasy, która rozciąga ArrayList i przypisanie go do o2

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

Tworzenie nowego wystąpienie anonimowej klasy (innej niż o2), która rozszerza ArrayList, który ma inicjator instancji bez op.

Funkcjonalnie klasy anon przypisane do o2 i o3 są równoważne, ale technicznie będą to różne klasy.