lunedì 7 ottobre 2013

Doppia Brace inizializzazione di idioma e suoi inconvenienti

Questo post è ispirato al concetto di doppio inizializzazione Brace spiegato  qui . Questa tecnica può essere usata per creare e inizializzare oggetti e rappresentano queste operazioni in un'unica espressione. E l'efficacia di questa tecnica è stata fortemente discussa su  StackOverflow .

Modo convenzionale per creare e popolare un oggetto

Siamo tutti familiarità con la creazione e la compilazione di dati in un ArrayList, in genere facciamo qualcosa di simile:

1.Lista <String> names2 = new ArrayList <> ();
2.names2.add ( "Name1" );
3.names2.add ( "file2" );
4.names2.add ( "Nome3" );
5.names2.add ( "NAME4" );
c'è ancora un altro approccio, utilizzando  Arrays.asList , ma questo crea una lista immutabile, così ulteriori risultati delle operazioni add a UnsupportedOperationException. Vediamo questo esempio così:

1.Lista <String> names3 = Arrays.asList ( "nome1" "nome2" "nome3" );
2. 
3./ / Questo getta java.lang.UnsupportedOperationException
4.names3.add ( "names4" );

Utilizzando doppia coppia di inizializzazione idioma

Così come fa doppio Brace inizializzazione ci aiuti qui? Vediamo un esempio per quello pure:

1.Elencare i nomi <String> = new ArrayList <String> () {{
. 2add ( "Mr. ABC" );
. 3add ( "Mr. XYZ" );
. 4add ( "Mrs. PQR" );
. 5aggiungere ( "MNOP" );
6.}};
Prende il nome per il doppio  {{}}  presente nell'espressione. Nel precedente esempio stiamo facendo due cose: 
1. Creare una classe interna anonima che estende ArrayList. 
2. Fornire un blocco di inizializzazione esempio che richiama l'  add  metodo e aggiunge gli elementi richiesti. Si prega di leggere  questo  per sapere di più su blocchi di inizializzazione.
Il vantaggio che abbiamo con questo approccio è che siamo in grado di combinare la creazione e l'inizializzazione in un'espressione e passare in giro in diversi metodi. Vediamo un esempio di questo:

01.classe MySomeClass {
02.protetto String someStrProp;
03.protetta int someIntProp;
04.protetto boolean someBoolProp;
05.}
06. 
07.pubblico class DoubleBraceInitialisationDemo {
08.pubblici statici vuoti main (String [] args) {
09./ / Ci sono 3 cose che accadono nel codice qui sotto:
10./ / 1. Estendere la classe MySomeClass
11./ / 2. Creare un'istanza della proroga
12./ / 1 e 2 corrispondono a creare Anonimo classe interna
13./ / 3. Creare un inizializzatore di istanza per impostare i valori per le proprietà.
14.someMethod ( nuovo MySomeClass () {{
15.someBoolProp = true ;
16.someIntProp = 12 ;
17.someStrProp = "qualche stringa" ;
18.}});
19.}
20. 
21.statica vuoto someMethod (MySomeClass someObj) {
22.System.out.println (someObj.getSomeIntProp ());
23.System.out.println (someObj.getSomeStrProp ());
. 24System.out.println (someObj.isSomeBoolProp ());
25.}
26.}
Anche se diciamo che questo approccio può essere utilizzato nella creazione di un oggetto e inizializzazione in un'unica espressione, dobbiamo essere consapevoli del fatto che non stiamo creando l'oggetto di quella classe, invece stiamo creando un oggetto della proroga di tale classe in esame .

Inconvenienti di utilizzo Doppio approccio inizializzazione Brace

Un uso eccessivo o abusare di questo idioma può spesso portare a numero gonfio di file di classe generati e questo può causare problemi di prestazioni come indicato nella discussione . Questo perché questo linguaggio fa uso di classi interne anonime per raggiungere il risultato richiesto.
E l'altro inconveniente è che questo non supporta l'uso di "operatore Diamond", una funzionalità introdotta in Java 7, mentre la creazione di istanze di tipi generici. Mi spiego con un esempio:
01./ / Questo è usare doppia inizializzazione brace.
02.Mappa <Integer, numeri string> =
03.new HashMap <Integer, String> () {{
04.mettere ( "One" );
. 05put ( "due" );
. 06put ( "Quattro" );
. 07put ( "Seven" );
08.}};
09./ / Diamond operatore in Java 7 ci permette di:
10.Mappa <Integer, String> myMap = new HashMap <> ();
11. 
12./ / Ma non si può utilizzare questa funzione durante l'utilizzo di doppia inizializzazione brace
13.Mappa <Integer, String> numeri2 =
14.new HashMap <> () {{
15.mettere ( "One" );
16.put ( "due" );
17.mettere ( "Quattro" );
18.mettere ( "Seven" );
19.}};
20./ / Il codice di cui sopra dà un errore che indica:
21./ / "Impossibile utilizzare <> con le classi interne anonime"
Questa doppia inizializzazione tutore è un idioma che è bene essere a conoscenza di come si comporta l'uso di una classe interna anonima e blocco di inizializzazione dell'istanza. Credo che questo sarà un buon trivia Java durante le interviste.