Sprievodca pre konštruktérov v Jave

1. Úvod

Staviteľmi sú vrátnici objektovo orientovaný dizajn.

V tomto tutoriáli uvidíme, ako fungujú ako jediné miesto, z ktorého inicializujú vnútorný stav vytváraného objektu.

Poďme ďalej a vytvorme jednoduchý objekt, ktorý predstavuje bankový účet.

2. Zriadenie bankového účtu

Predstavte si, že musíme vytvoriť triedu, ktorá predstavuje bankový účet. Bude obsahovať meno, dátum vytvorenia a zostatok.

Poďme tiež prekonať natiahnuť spôsob tlače podrobností na konzolu:

trieda BankAccount {názov reťazca; LocalDateTime otvorené; dvojitá rovnováha; @Override public String toString () {return String.format ("% s,% s,% f", this.name, this.opened.toString (), this.balance); }} 

Táto trieda teraz obsahuje všetky potrebné polia potrebné na ukladanie informácií o bankovom účte, zatiaľ však neobsahuje konštruktor.

To znamená, že ak vytvoríme nový objekt, hodnoty poľa by sa neinicializovali:

Účet BankAccount = nový BankAccount (); account.toString (); 

Prevádzka natiahnuť vyššie uvedená metóda bude mať za následok výnimku, pretože objekty názov a otvoril sú stále nulový:

java.lang.NullPointerException na adrese com.baeldung.constructors.BankAccount.toString (BankAccount.java:12) na adrese com.baeldung.constructors.ConstructorUnitTest .givenNoExplicitContructor_whenUsed_thenFails (ConstructorUnitTest.java:23) 

3. Konštruktér bez argumentov

Opravíme to pomocou konštruktora:

trieda BankAccount {public BankAccount () {this.name = ""; this.opened = LocalDateTime.now (); this.balance = 0,0d; }} 

Všimnite si pár vecí o konštruktore, ktorý sme práve napísali. Po prvé, je to metóda, ale nemá návratový typ. Je to preto, že konštruktor implicitne vracia typ objektu, ktorý vytvára. Telefonovanie nový bankový účet () teraz zavolá konštruktéra vyššie.

Po druhé, nevyžaduje žiadne argumenty. Tento konkrétny druh konštruktora sa nazýva nkonštruktor o-argumentu.

Prečo sme to nepotrebovali prvýkrát, však? Je to preto, že keď sme výslovne nepíš žiadny konštruktor, kompilátor pridá predvolený konštruktor bez argumentov.

Preto sa nám podarilo postaviť objekt prvýkrát, aj keď sme konštruktor nenapísali výslovne. Predvolený konštruktor bez argumentov jednoducho nastaví všetkých členov na ich predvolené hodnoty.

Pre objekty je to tak nulový, čo malo za následok výnimku, ktorú sme videli skôr.

4. Parametrizovaný konštruktor

Skutočnou výhodou konštruktérov je, že nám pomáhajú udržiavať zapuzdrenie pri vstrekovaní stavu do objektu.

Aby sme teda s týmto bankovým účtom mohli urobiť niečo skutočne užitočné, musíme byť schopní skutočne vložiť do objektu nejaké počiatočné hodnoty.

Urobiť to, napíšme a parametrizovaný konštruktor, teda konštruktor, ktorý berie nejaké argumenty:

trieda BankAccount {public BankAccount () {...} public BankAccount (reťazec name, LocalDateTime opened, double balance) {this.name = name; this.opened = otvorené; this.balance = zostatok; }} 

Teraz môžeme s našimi urobiť niečo užitočné Bankový účet trieda:

 LocalDateTime opened = LocalDateTime.of (2018, Month.JUNE, 29, 06, 30, 00); Účet BankAccount = nový BankAccount ("Tom", otvorený, 1000.0f); account.toString (); 

Všimnite si, že naša trieda má teraz 2 konštruktory. Explicitný konštruktor bez argumentov a parametrizovaný konštruktor.

Môžeme vytvoriť toľko konštruktorov, koľko sa nám páči, ale pravdepodobne by sme chceli, aby ich nebolo príliš veľa. To by bolo trochu mätúce.

Ak v našom kóde nájdeme príliš veľa konštruktorov, môže byť užitočných niekoľko vzorov vytvorenia návrhu.

5. Konštruktor kopírovania

Konštruktéri sa nemusia obmedzovať iba na samotnú inicializáciu. Dali by sa tiež použiť na vytváranie správania. Predstavte si, že musíme byť schopní vytvoriť nový účet z existujúceho.

Nový účet by mal mať rovnaký názov ako starý účet, dnešný dátum vytvorenia a žiadne prostriedky. Môžeme to urobiť pomocou a kopírovací konštruktor:

public BankAccount (BankAccount other) {this.name = other.name; this.opened = LocalDateTime.now (); this.balance = 0,0f; } 

Teraz máme nasledujúce správanie:

LocalDateTime opened = LocalDateTime.of (2018, Month.JUNE, 29, 06, 30, 00); Účet BankAccount = nový BankAccount ("Tim", otvorený, 1000.0f); BankAccount newAccount = nový BankAccount (účet); assertThat (account.getName ()). isEqualTo (newAccount.getName ()); assertThat (account.getOpened ()). isNotEqualTo (newAccount.getOpened ()); assertThat (newAccount.getBalance ()). isEqualTo (0,0f); 

6. Spútaný konštruktér

Samozrejme, môžeme byť schopní odvodiť niektoré parametre konštruktora alebo dať niektorým z nich predvolené hodnoty.

Mohli by sme napríklad vytvoriť nový bankový účet iba s menom.

Vytvorme teda konštruktor s a názov parameter a dajte ostatným parametrom predvolené hodnoty:

public BankAccount (názov reťazca, otvorený LocalDateTime, dvojitý zostatok) {this.name = meno; this.opened = otvorené; this.balance = zostatok; } public BankAccount (názov reťazca) {this (name, LocalDateTime.now (), 0,0f); }

S kľúčovým slovom toto, voláme druhého konštruktéra.

Musíme si to pamätať ak chceme zreťaziť konštruktor nadtriedy, musíme použiť Super namiesto toto.

Pamätajte tiež na to toto alebo Super výraz by mal byť vždy prvým vyjadrením.

7. Typy hodnôt

Zaujímavé použitie konštruktorov v Jave je pri vytváraní Hodnotové objekty. Hodnotový objekt je objekt, ktorý po inicializácii nezmení svoj vnútorný stav.

To znamená, že objekt je nemenný. Nezmeniteľnosť v Jave je trochu jemná a pri vytváraní objektov je treba postupovať opatrne.

Poďme do toho a vytvorme nemennú triedu:

trieda Transakcia {final BankAccount bankAccount; konečný dátum LocalDateTime; konečná dvojnásobná suma; verejná transakcia (účet BankAccount, dátum LocalDateTime, dvojnásobná suma) {this.bankAccount = účet; this.date = dátum; this.amount = suma; }} 

Všimnite si, že teraz používame konečné kľúčové slovo pri definovaní členov triedy. To znamená, že každého z týchto členov je možné inicializovať iba v rámci konštruktora triedy. Nemôžu byť neskôr znova pridelené žiadnou inou metódou. Tieto hodnoty môžeme čítať, ale nemeníme.

Ak vytvoríme viac konštruktorov pre Transakcia triedy, každý konštruktor bude musieť inicializovať každú konečnú premennú. Ak to neurobíte, bude to mať za následok chybu kompilácie.

8. Záver

Prešli sme si prehliadku rôznych spôsobov, ako konštruktéri stavajú objekty. Pri rozumnom použití tvoria konštrukty základné stavebné prvky objektovo-orientovaného dizajnu v Jave.

Ako vždy, vzorky kódu nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found