Java Double Brace Initialization
1. Pregled
U ovom brzom uputstvu pokazat ćemo kako se mogu koristiti dvostruke zagrade stvaranje i inicijalizacija objekata u jednom Java izrazu.
Također ćemo pogledati zašto se ova tehnika može smatrati anti-uzorkom.
2. Standardni pristup
Obično inicijaliziramo i popunjavamo skup zemalja kako slijedi:
@Test javna void whenInitializeSetWithoutDoubleBraces_containsElements () {Postavi zemlje = novi HashSet (); countries.add ("Indija"); countries.add ("SSSR"); countries.add ("SAD"); assertTrue (countries.contens ("India")); }
Kao što se može vidjeti iz gornjeg primjera, radimo sljedeće:
- Stvorite instancu HashSet
- Dodajte zemlje u HashSet
- Konačno, tvrdimo je li zemlja prisutna u HashSet
3. Korištenje dvostruke zagrade
Međutim, zapravo možemo kombinirati stvaranje i inicijalizaciju u jednoj izjavi; ovdje koristimo dvostruke zagrade:
@Test javna praznina whenInitializeSetWithDoubleBraces_containsElements () {Postavi zemlje = novi HashSet () {{add ("India"); dodaj ("SSSR"); dodaj ("SAD"); }}; assertTrue (countries.contens ("India")); }
Kao što se može vidjeti iz gornjeg primjera, mi smo:
- Stvaranje anonimne unutarnje klase koja se proširuje HashSet
- Pružanje bloka inicijalizacije instance koji poziva metodu dodavanja i dodaje naziv države u HashSet
- Napokon, možemo tvrditi je li zemlja prisutna u HashSet
4. Prednosti upotrebe dvostrukih zagrada
Neke su jednostavne prednosti upotrebe dvostrukih zagrada:
- Manje redaka koda u usporedbi s izvornim načinom stvaranja i inicijalizacije
- Kôd je čitljiviji
- Inicijalizacija izrade vrši se u istom izrazu
5. Mane upotrebe dvostrukih zagrada
Mane primjene dvostrukih zagrada su:
- Nejasan, ne nadaleko poznat način inicijalizacije
- Stvara dodatnu klasu svaki put kad je koristimo
- Ne podržava upotrebu "operatora dijamanata" - značajke uvedene u Javi 7
- Ne radi ako je označena klasa koju pokušavamo proširiti konačni
- Sadrži skrivenu referencu na priloženu instancu, što može uzrokovati curenje memorije
Zbog ovih nedostataka inicijalizacija dvostrukog zagrada smatra se anti-uzorkom.
6. Alternative
6.1. Metode tvorničke struje
Umjesto toga, možemo dobro iskoristiti novi Java 8 Stream API za inicijalizaciju našeg Postavi:
@Test public void whenInitializeUnmodifiableSetWithDoubleBrace_containsElements () {Set countries = Stream.of ("India", "SSSR", "USA") .collect (collectionAndThen (toSet (), Collections :: unmodifiableSet)); assertTrue (countries.contens ("India")); }
6.2. Java 9 Zbirke Tvorničke metode
Također, Java 9 donijet će niz korisnih tvorničkih metoda koje će omogućiti sljedeće:
Lista popisa = List.of ("Indija", "SSSR", "SAD"); Set set = Set.of ("Indija", "SSSR", "SAD");
Više o tome možete pročitati u ovom članku.
7. Zaključak
U ovom kratkom vodiču raspravljali smo o upotrebi dvostrukih zagrada zajedno s njezinim prednostima i nedostacima.
Implementacija ovih primjera može se naći u projektu GitHub - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.