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:

  1. Stvorite instancu HashSet
  2. Dodajte zemlje u HashSet
  3. 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:

  1. Stvaranje anonimne unutarnje klase koja se proširuje HashSet
  2. Pružanje bloka inicijalizacije instance koji poziva metodu dodavanja i dodaje naziv države u HashSet
  3. 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.