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> () {{
. 2
add (
"Mr. ABC"
);
. 3
add (
"Mr. XYZ"
);
. 4
add (
"Mrs. PQR"
);
. 5
aggiungere (
"MNOP"
);
6.
}};
Prende il nome per il doppio
1. Creare una classe interna anonima che estende ArrayList.
2. Fornire un blocco di inizializzazione esempio che richiama l'
{{}}
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 ());
. 24
System.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 (
1
,
"One"
);
. 05
put (
2
,
"due"
);
. 06
put (
4
,
"Quattro"
);
. 07
put (
7
,
"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 (
1
,
"One"
);
16.
put (
2
,
"due"
);
17.
mettere (
4
,
"Quattro"
);
18.
mettere (
7
,
"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.
Corso Java - Corsi programmazione Java
- Corso programmazione
Android - Certificazione
Java - Corsi Java
- Corso Java Avanzato