Initialisatie van Java Double Brace

1. Overzicht

In deze korte tutorial laten we zien hoe dubbele beugels kunnen worden gebruikt het maken en initialiseren van objecten in een enkele Java-expressie.

We zullen ook bekijken waarom deze techniek als een antipatroon kan worden beschouwd.

2. Standaardbenadering

Normaal gesproken initialiseren en vullen we een reeks landen als volgt:

@Test openbare leegte whenInitializeSetWithoutDoubleBraces_containsElements () {Landen instellen = nieuwe HashSet (); landen.add ("India"); landen.add ("USSR"); landen.add ("VS"); assertTrue (landen.bevat ("India")); } 

Zoals te zien is in het bovenstaande voorbeeld, doen we het volgende:

  1. Maak een instantie van HashSet
  2. Voeg landen toe aan het HashSet
  3. Ten slotte stellen we vast of het land aanwezig is in de HashSet

3. Gebruik van dubbele beugel

We kunnen de creatie en initialisatie echter in één enkele instructie combineren; hier maken we gebruik van dubbele beugels:

@Test openbare leegte whenInitializeSetWithDoubleBraces_containsElements () {Landen instellen = nieuwe HashSet () {{toevoegen ("India"); add ("USSR"); add ("VS"); }}; assertTrue (landen.bevat ("India")); } 

Zoals te zien is in het bovenstaande voorbeeld, zijn we:

  1. Een anonieme innerlijke klasse creëren die zich uitbreidt HashSet
  2. Het verstrekken van een instantie-initialisatieblok dat de add-methode aanroept en de landnaam toevoegt aan het HashSet
  3. Ten slotte kunnen we stellen of het land aanwezig is in de HashSet

4. Voordelen van het gebruik van dubbele beugels

Er zijn enkele eenvoudige voordelen van het gebruik van dubbele beugels:

  • Minder regels code vergeleken met de oorspronkelijke manier van maken en initialiseren
  • De code is beter leesbaar
  • Initialisatie van het maken gebeurt in dezelfde uitdrukking

5. Nadelen van het gebruik van dubbele beugels

Nadelen van het gebruik van dubbele beugels zijn:

  • Obscure, niet algemeen bekende manier om de initialisatie uit te voeren
  • Elke keer dat we er gebruik van maken, creëert het een extra klasse
  • Biedt geen ondersteuning voor het gebruik van de "diamantoperator" - een functie die is geïntroduceerd in Java 7
  • Werkt niet als de klasse die we proberen uit te breiden, is gemarkeerd laatste
  • Bevat een verborgen verwijzing naar het omsluitende exemplaar, wat geheugenlekken kan veroorzaken

Vanwege deze nadelen wordt initialisatie met dubbele beugel als een antipatroon beschouwd.

6. Alternatieven

6.1. Stream Factory-methoden

In plaats daarvan kunnen we goed gebruik maken van de nieuwe Java 8 Stream API om onze Set:

@Test openbare leegte whenInitializeUnmodifiableSetWithDoubleBrace_containsElements () {Stel landen = Stream.of ("India", "USSR", "VS") .collect (collectionAndThen (toSet (), Collections :: unmodifiableSet)); assertTrue (landen.bevat ("India")); } 

6.2. Fabrieksmethoden voor Java 9-verzamelingen

Bovendien brengt Java 9 een reeks handige fabrieksmethoden die het volgende mogelijk maken:

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

In dit artikel leest u hier meer over.

7. Conclusie

In deze beknopte tutorial bespraken we het gebruik van dubbele beugels en de voor- en nadelen ervan.

De implementatie van deze voorbeelden is te vinden in het GitHub-project - dit is een op Maven gebaseerd project, dus het moet gemakkelijk kunnen worden geïmporteerd en uitgevoerd zoals het is.