Initialisering af Java Double Brace
1. Oversigt
I denne hurtige vejledning viser vi, hvordan dobbeltbøjler kan bruges til oprettelse og initialisering af objekter i et enkelt Java-udtryk.
Vi vil også se på, hvorfor denne teknik kan betragtes som et antimønster.
2. Standard tilgang
Normalt initialiserer og udfylder vi et sæt lande som følger:
@Test offentlig ugyldig nårInitializeSetWithoutDoubleBraces_containsElements () {Set lande = nyt HashSet (); country.add ("Indien"); country.add ("USSR"); country.add ("USA"); assertTrue (lande. indeholder ("Indien")); }
Som det kan ses fra ovenstående eksempel, gør vi følgende:
- Opret en forekomst af HashSet
- Føj lande til HashSet
- Endelig hævder vi, om landet er til stede i HashSet
3. Brug af dobbeltbøjle
Vi kan dog faktisk kombinere oprettelse og initialisering i en enkelt erklæring; det er her, vi bruger dobbelte seler:
@Test offentlig ugyldig nårInitializeSetWithDoubleBraces_containsElements () {Set lande = ny HashSet () {{tilføj ("Indien"); tilføj ("USSR"); tilføj ("USA"); }}; assertTrue (lande. indeholder ("Indien")); }
Som det kan ses fra ovenstående eksempel, er vi:
- Oprettelse af en anonym indre klasse, der strækker sig HashSet
- Tilvejebringelse af en initialiseringsblok, der påberåber add-metoden og føjer landets navn til HashSet
- Endelig kan vi hævde, om landet er til stede i HashSet
4. Fordele ved at bruge dobbelte seler
Der er nogle enkle fordele ved at bruge dobbelte seler:
- Færre kodelinjer sammenlignet med den oprindelige måde til oprettelse og initialisering
- Koden er mere læselig
- Initiering af oprettelse sker i samme udtryk
5. Ulemper ved at bruge dobbelte seler
Ulemper ved at bruge dobbelte seler er:
- Uklar, ikke almindeligt kendt måde at foretage initialiseringen på
- Det skaber en ekstra klasse hver gang vi bruger den
- Understøtter ikke brugen af "diamantoperatøren" - en funktion introduceret i Java 7
- Virker ikke, hvis den klasse, vi prøver at udvide, er markeret endelig
- Indeholder en skjult reference til den vedlagte forekomst, som kan forårsage hukommelseslækage
Det skyldes disse ulemper, at initialisering af dobbeltbøjle betragtes som et antimønster.
6. Alternativer
6.1. Stream fabriksmetoder
I stedet kan vi bruge den nye Java 8 Stream API til at initialisere vores Sæt:
@Test offentlig ugyldig nårInitializeUnmodifiableSetWithDoubleBrace_containsElements () {Set lande = Stream.of ("Indien", "USSR", "USA") .collect (collectAndThen (toSet (), Collections :: unmodifiableSet)); assertTrue (lande. indeholder ("Indien")); }
6.2. Java 9 samlinger Fabriksmetoder
Java 9 vil også bringe et sæt nyttige fabriksmetoder, der gør følgende mulige:
List list = List.of ("Indien", "USSR", "USA"); Set set = Set.of ("Indien", "USSR", "USA");
Du kan læse mere om dette i denne artikel.
7. Konklusion
I denne koncise vejledning diskuterede vi brugen af dobbeltbøjler sammen med dens fordele og ulemper.
Implementeringen af disse eksempler findes i GitHub-projektet - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.