Útmutató a Java építőihez

1. Bemutatkozás

A kivitelezők a kapuőrök objektum-orientált tervezés.

Ebben az oktatóanyagban megnézzük, hogyan működnek egyetlen helyként, ahonnan inicializálhatják a létrehozandó objektum belső állapotát.

Haladjunk előre, és hozzunk létre egy egyszerű objektumot, amely egy bankszámlát képvisel.

2. Bankszámla beállítása

Képzelje el, hogy létre kell hoznunk egy osztályt, amely egy bankszámlát képvisel. Tartalmazni fog egy nevet, a létrehozás dátumát és az egyenleget.

Ezenkívül írjuk felül a Sztring módszer a részletek konzolra történő kinyomtatására:

osztály BankAccount {String név; LocalDateTime megnyílt; kettős egyensúly; @Orride public String toString () {return String.format ("% s,% s,% f", this.name, this.opened.toString (), this.balance); }} 

Ez az osztály tartalmazza az összes szükséges mezőt, amely szükséges a bankszámla adatainak tárolásához, de még nem tartalmaz konstruktort.

Ez azt jelenti, hogy ha új objektumot hozunk létre, akkor a mezőértékeket nem inicializáljuk:

BankAccount számla = new BankAccount (); account.toString (); 

A Sztring A fenti módszer kivételt eredményez, mert az objektumok név és nyitott még mindig vannak nulla:

java.lang.NullPointerException a com.baeldung.constructors.BankAccount.toString (BankAccount.java:12) a com.baeldung.constructors.ConstructorUnitTest .givenNoExplicitContructor_whenUsed_thenFails (ConstructorUnit) 

3. Argumentum nélküli konstruktor

Javítsuk ki egy konstruktorral:

osztály BankAccount {public BankAccount () {this.name = ""; this.opened = LocalDateTime.now (); ez.egyensúly = 0.0d; }} 

Figyeljen meg néhány dolgot a konstruktorról, amelyet éppen írtunk. Először is, ez egy módszer, de nincs visszatérési típusa. Ez azért van, mert a konstruktor implicit módon visszaadja az általa létrehozott objektum típusát. Hívás új BankAccount () most felhívja a fenti konstruktort.

Másodsorban nem vesz fel érveket. Ezt a fajta konstruktort nevezzük n-neko-argumentum konstruktor.

Miért nem volt rá szükségünk először? Azért, mert amikor mi ne írj kifejezetten konstruktort, a fordító hozzáad egy alapértelmezett, argumentum nélküli konstruktort.

Ezért tudtuk először megalkotni az objektumot, pedig nem írtunk kifejezetten konstruktort. Az alapértelmezett, egyetlen argumentum-készítő sem fogja egyszerűen beállítani az összes tagot az alapértelmezett értékre.

Tárgyaknál ez nulla, ami azt a kivételt eredményezte, amelyet korábban láttunk.

4. Paraméterezett kivitelező

A kivitelezők valódi előnye, hogy segítenek fenntartani Egységbezárás amikor állapotot injektálnak a tárgyba.

Tehát ahhoz, hogy valami igazán hasznosat tegyünk ezzel a bankszámlával, képesnek kell lennünk bizonyos kezdeti értékek beinjekciózására az objektumba.

Ehhez, írjunk egy paraméterezett konstruktor, vagyis egy konstruktor, amely néhány érvet vesz fel:

osztály BankAccount {public BankAccount () {...} public BankAccount (Karakterlánc neve, LocalDateTime nyitva, kettős egyenleg) {this.name = név; ez.nyitott = nyitott; ez.egyensúly = egyensúly; }} 

Most valami hasznosat tehetünk a sajátunkkal Bankszámla osztály:

 LocalDateTime opened = LocalDateTime.of (2018, Június 29., 06., 30., 00. hónap); BankAccount számla = new BankAccount ("Tom", nyitva, 1000.0f); account.toString (); 

Figyeljük meg, hogy osztályunknak most 2 konstruktora van. Egy explicit, argumentum nélküli konstruktor és egy paraméterezett konstruktor.

Hozhatunk létre annyi konstruktort, amennyit csak akarunk, de valószínűleg nem szeretnénk túl sokat létrehozni. Ez kissé zavaros lenne.

Ha túl sok konstruktort találunk a kódunkban, akkor néhány kreatív tervezési minta hasznos lehet.

5. Másolatkészítő

A kivitelezőknek nem kell csupán az inicializálásra korlátozódniuk. Használhatók magatartásformák létrehozására is. Képzelje el, hogy képesnek kell lennünk egy új fiók létrehozására egy meglévő fiókból.

Az új számlának azonos nevűnek kell lennie, mint a régi számlának, a mai létrehozás dátumának és pénzeszközök nélkül. Ezt megtehetjük az a használatával másolat készítő:

public BankAccount (BankAccount other) {this.név = egyéb.név; this.opened = LocalDateTime.now (); ez.egyensúly = 0.0f; } 

Most a következő viselkedésünk van:

LocalDateTime opened = LocalDateTime.of (2018, Június 29., 06., 30., 00. hónap); BankAccount számla = new BankAccount ("Tim", nyitva, 1000.0f); BankAccount newAccount = új BankAccount (számla); assertThat (account.getName ()). isEqualTo (newAccount.getName ()); assertThat (account.getOpened ()). isNotEqualTo (newAccount.getOpened ()); assertThat (newAccount.getBalance ()). isEqualTo (0.0f); 

6. Láncolt konstruktőr

Természetesen következtethetünk a konstruktor néhány paraméterére, ill adjon meg néhányuknak alapértelmezett értékeket.

Például létrehozhatnánk egy új bankszámlát csak a névvel.

Tehát hozzunk létre egy konstruktort a-val név paramétert, és adja meg a többi paraméter alapértelmezett értékét:

public BankAccount (karakterlánc neve, LocalDateTime nyitva, kettős egyenleg) {this.name = név; ez.nyitott = nyitott; ez.egyensúly = egyensúly; } public BankAccount (karakterlánc neve) {this (név, LocalDateTime.now (), 0.0f); }

A kulcsszóval ez, hívjuk a másik kivitelezőt.

Erre emlékeznünk kell ha szuperosztályú konstruktort akarunk láncolni, akkor használnunk kell szuper ahelyett ez.

Emlékezzen arra is ez vagy szuper a kifejezésnek mindig az első állításnak kell lennie.

7. Értéktípusok

A Java-ban a konstruktorok érdekes felhasználása a Értékobjektumok. Az értékobjektum olyan objektum, amely inicializálása után nem változtatja meg belső állapotát.

Vagyis az objektum megváltoztathatatlan. A Java megváltoztathatatlansága kissé árnyalt, és ügyelni kell az objektumok elkészítésére.

Menjünk előre, és hozzunk létre egy változhatatlan osztályt:

osztály Tranzakció {final BankAccount bankAccount; végső LocalDateTime dátum; végső dupla összeg; nyilvános tranzakció (BankAccount számla, LocalDateTime dátum, dupla összeg) {this.bankAccount = számla; this.date = dátum; ez.összeg = összeg; }} 

Figyeljük meg, hogy most már a végső kulcsszó az osztály tagjainak meghatározásakor. Ez azt jelenti, hogy ezen tagok mindegyikét csak az osztály konstruktorán belül lehet inicializálni. Később más módszerrel nem lehet őket átruházni. Elolvashatjuk ezeket az értékeket, de nem változtathatjuk meg őket.

Ha több konstruktort hozunk létre a Tranzakció osztályban, minden konstruktornak inicializálnia kell minden végső változót. Ennek elmulasztása fordítási hibát eredményez.

8. Következtetés

Körbejártuk a kivitelezők objektumok építésének különböző módjait. Ésszerű használat esetén a konstrukciók alkotják az objektum-orientált tervezés alapvető építőköveit a Java-ban.

Mint mindig, a kódminták megtalálhatók a GitHubon.