제이온

[Hatékony Java] 2. tétel: Ha sok paramétere van a konstruktornak, fontold meg a Builder használatát

  • Írás nyelve: Koreai
  • Országkód: Minden országcountry-flag
  • Informatika

Létrehozva: 2024-04-27

Létrehozva: 2024-04-27 00:46

Fokozatos konstruktor minta

A statikus gyáraknak és a konstruktoroknak egyaránt nehéz megfelelően kezelniük a sok paramétert. Tegyük fel, hogy az osztálynak 6 mezője van, és szeretnénk külön konstruktort létrehozni 2 paraméter esetén, 3 paraméter esetén stb. Ilyenkor a következőképpen használhatjuk a fokozatos konstruktor mintát.



De még ez is problémás lehet, ha túl sok a paraméter, mert nehezebb lesz megérteni a kód olvasása közben, hogy melyik paraméter mit jelent, és könnyen összetéveszthetők a hasonló típusú paraméterek is.


Java Bean minta

A Java Bean minta lényege, hogy paraméter nélküli konstruktort használunk az objektum létrehozásához, majd a setter metódusok segítségével állítjuk be a kívánt paraméterek értékét.



A Java Bean minta segítségével még sok paraméter esetén sem kell aggódnunk, hogy összekeverjük őket az objektum létrehozása során. Azonban egy objektum létrehozásához több setter metódust is hívni kell, és az objektum nem lesz konzisztens, amíg az összes paramétert be nem állítjuk. Emiatt az osztály nem lesz változatlan.


Építő minta

A fokozatos konstruktor minta stabilitását és a Java Bean minta olvashatóságát ötvözi az építő minta, amelyet általában használunk.

Az ügyfél nem hozza létre közvetlenül a kívánt objektumot, hanem a kötelező paraméterekkel meghívja a konstruktort, és így egy építő objektumot kap. Ezután az építő objektum által biztosított, setter metódusokhoz hasonló metódusok segítségével állítja be a kívánt választható paramétereket. Végül egy paraméter nélküli build() metódust hív meg, hogy megkapja a kívánt objektumot.



A Builder osztály konstruktora csak a kötelező paramétereket fogadja el, a többi választható paramétert pedig setter metódusokhoz hasonló metódusokkal lehet beállítani. Végül a build() metódus segítségével hozhatjuk létre a kész NutritionFactsWithBuilderPattern objektumot. A NutritionFactsWithBuilderPattern osztály változatlan, és a builder setter metódusai a buildert magukat adják vissza, így láncolhatóan hívhatók. Ezt a módszert folyékony API-nak vagy metódusláncolásnak nevezzük.



Az ügyfél szempontjából az építő minta egyszerűbbé és olvashatóbbá teszi a kód írását.


Az építő minta jól illeszkedik a hierarchikusan felépített osztályokhoz


A Pizza.Builder osztály rekurzív típuskorlátozást használó generikus típus, és a self() absztrakt metódus hozzáadásával a leszármazott osztályokban nem kell típuskonverziót végezni a metódusláncoláshoz. A leszármazott osztályokban ennek az absztrakt metódusnak a visszatérési értéke önmaguk lesz.

Nézzük meg most a Pizza leszármazott osztályait, a New York-i pizzát és a calzone pizzát, hogy megtapasztaljuk az építő minta rugalmasságát.



A leszármazott osztályok építőiben definiált build() metódusok a konkrét leszármazott osztályt adják vissza. Az a tulajdonság, hogy a leszármazott osztályok metódusai nem a szülőosztály metódusainak visszatérési típusát, hanem annak leszármazott típusát adják vissza, kovariáns visszatérési típusozásnak nevezzük. Ennek a funkciónak köszönhetően az ügyfélnek nem kell típuskonverziót végeznie.



Az ügyfél a Pizza enumját és a leszármazott osztályok enumjait is használhatja, és a megfelelő metódusok segítségével hozhat létre objektumokat.


Az építő minta hátrányai

  • Létre kell hozni az építő objektumot.
  • A kód terjedelmes lehet.


Összegzés

Ha a konstruktornak vagy a statikus gyármetódusnak túl sok paramétert kell kezelnie, érdemes megfontolni az építő minta használatát.


Forrás

  • Effective Java

Hozzászólások0