Initiering av Java Double Brace

1. Oversikt

I denne raske opplæringen viser vi hvordan doble seler kan brukes til lage og initialisere objekter i et enkelt Java-uttrykk.

Vi vil også se på hvorfor denne teknikken kan betraktes som et antimønster.

2. Standard tilnærming

Normalt initialiserer vi og fyller ut et sett med land som følger:

@Test offentlig ugyldig nårInitializeSetWithoutDoubleBraces_containsElements () {Sett land = ny HashSet (); country.add ("India"); country.add ("Sovjetunionen"); country.add ("USA"); assertTrue (lands. inneholder ("India")); } 

Som det fremgår av eksemplet ovenfor, gjør vi følgende:

  1. Opprett en forekomst av HashSet
  2. Legg land til HashSet
  3. Til slutt hevder vi om landet er til stede i HashSet

3. Bruke Double Brace

Imidlertid kan vi faktisk kombinere oppretting og initialisering i en enkelt uttalelse; det er her vi bruker doble seler:

@Test offentlig ugyldig nårInitializeSetWithDoubleBraces_containsElements () {Sett land = nytt HashSet () {{add ("India"); legg til ("Sovjetunionen"); legg til ("USA"); }}; assertTrue (lands. inneholder ("India")); } 

Som det kan sees fra eksemplet ovenfor, er vi:

  1. Opprette en anonym indre klasse som strekker seg HashSet
  2. Tilby en initialiseringsblokk som påkaller add-metoden og legger til landnavnet i HashSet
  3. Til slutt kan vi hevde om landet er til stede i HashSet

4. Fordeler med bruk av doble seler

Det er noen enkle fordeler ved å bruke doble seler:

  • Færre kodelinjer sammenlignet med den opprinnelige måten å opprette og initialisere på
  • Koden er mer lesbar
  • Initiering av skapelse gjøres i samme uttrykk

5. Ulemper ved å bruke doble seler

Ulemper ved å bruke doble seler er:

  • Uklar, ikke allment kjent måte å gjøre initialiseringen på
  • Det skaper en ekstra klasse hver gang vi bruker den
  • Støtter ikke bruken av "diamantoperatøren" - en funksjon introdusert i Java 7
  • Fungerer ikke hvis klassen vi prøver å utvide er merket endelig
  • Har en skjult referanse til den vedlagte forekomsten, noe som kan føre til minnelekkasjer

Det er på grunn av disse ulempene at initialisering av dobbel stag betraktes som et antimønster.

6. Alternativer

6.1. Stream Factory Methods

I stedet kan vi bruke den nye Java 8 Stream API til å initialisere vår Sett:

@Test offentlig ugyldig nårInitializeUnmodifiableSetWithDoubleBrace_containsElements () {Sett land = Stream.of ("India", "USSR", "USA") .collect (collectAndThen (toSet (), Collections :: unmodifiableSet)); assertTrue (lands. inneholder ("India")); } 

6.2. Java 9 Collections Factory Methods

Java 9 vil også gi et sett med nyttige fabrikkmetoder som vil gjøre følgende mulig:

List list = List.of ("India", "USSR", "USA"); Set set = Set.of ("India", "USSR", "USA"); 

Du kan lese mer om dette i denne artikkelen.

7. Konklusjon

I denne konsise opplæringen diskuterte vi bruken av doble seler sammen med fordelene og ulempene.

Implementeringen av disse eksemplene finnes i GitHub-prosjektet - dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.