Vnorené a vnútorné triedy Kotlina

1. Úvod

V tomto tutoriáli sa pozrieme na štyri spôsoby, ako vytvoriť vnorené a vnútorné triedy v Kotline.

2. Rýchle porovnanie s Javou

Pre tých, ktorí uvažujú o triedach vnorených do Java, urobme rýchly prehľad súvisiacich výrazov:

KotlinJava
Vnútorné triedyNestatické vnorené triedy
Miestne triedyMiestne triedy
Anonymné objektyAnonymné triedy
Vnorené triedyStatické vnorené triedy

Aj keď určite nie je totožný, môžeme túto tabuľku použiť ako pomôcku pri uvažovaní o možnostiach a prípadoch použitia pre každú z nich.

3. Vnútorné triedy

Najskôr môžeme pomocou kľúčového slova deklarovať triedu vo vnútri inej triedy vnútorné.

Tieto triedy mať prístup k členom nasledujúcej triedy, dokonca aj k súkromným členom.

Aby sme to mohli použiť, musíme najskôr vytvoriť inštanciu vonkajšej triedy; bez toho nemôžeme používať vnútorné triedy.

Vytvorme a Pevný disk vnútorná trieda vo vnútri a Počítač trieda:

trieda Počítač (model val: String) {vnútorná trieda HardDisk (val sizeInGb: Int) {fun getInfo () = "Nainštalovaný na $ {[chránený e-mailom]} s $ sizeInGb GB"}}

Upozorňujeme, že na získanie prístupu k členom domény používame tento výraz Počítač triedy, čo je podobné ako keď robíme Počítač.to v ekvivalente Java Pevný disk.

Pozrime sa na to v akcii:

@Test fun givenHardDisk_whenGetInfo_thenGetComputerModelAndDiskSizeInGb () {val hardDisk = Computer ("Desktop"). HardDisk (1000) assertThat (hardDisk.getInfo ()) .isEqualTo ("Inštalovaný na počítači (model = Desktop) s 1 000 GB")}

4. Miestne vnútorné triedy

Ďalej môžeme definovať triedu v tele metódy alebo v bloku rozsahu.

Urobme si krátky príklad, aby sme zistili, ako to funguje.

Najskôr definujme a zapnutie metóda pre našu Počítač trieda:

fun powerOn (): String {// ...}

Vo vnútri zapnutie metóda deklarujme a Led triedy a nechaj to blikať:

fun powerOn (): String {class Led (val color: String) {fun blink (): String {return "blinking $ color"}} val powerLed = Led ("Green") return powerLed.blink ()}

Upozorňujeme, že rozsah pôsobnosti Led trieda je iba vo vnútri metódy.

S miestnymi vnútornými triedami môžeme pristupovať a meniť premenné deklarované vo vonkajšom rozsahu. Pridajme a defaultColor v zapnutie metóda:

fun powerOn (): String {var defaultColor = "Blue" // ...} 

Teraz pridajme a changeDefaultPowerOnColor v našom Led trieda:

trieda Led (farba valca: String) {// ... zábava changeDefaultPowerOnColor () {defaultColor = "Violet"}} val powerLed = Led ("zelená") log.debug ("defaultColor je $ defaultColor") powerLed.changeDefaultPowerOnColor ( ) log.debug ("defaultColor zmenený v triede Led" + "na $ defaultColor")

Ktoré výstupy:

[main] DEBUG c.b.n.Computer - defaultColor is Blue [main] DEBUG c.b.n.Computer - defaultColor zmenený vo vnútri triedy Led na Violet

5. Anonymné objekty

Anonymné objekty možno použiť na definovanie implementácie rozhrania alebo abstraktnej triedy bez vytvorenia opakovane použiteľnej implementácie.

Veľký rozdiel medzi anonymnými objektmi v Kotline a anonymnými vnútornými triedami v Jave je v tom anonymné objekty môžu implementovať viac rozhraní a metód.

Najskôr pridajme a Prepínač rozhranie v našom Počítač trieda:

prepínač rozhrania {fun on (): String}

Teraz pridajme implementáciu tohto rozhrania do zapnutie metóda:

fun powerOn (): String {// ... val powerSwitch = object: Switcher {override fun on (): String {return powerLed.blink ()}} return powerSwitch.on ()}

Ako vidíme, definovať svoje anonymné vypínač objekt používame výraz objektu. Musíme tiež vziať do úvahy, že zakaždým, keď je vyvolaný výraz objektu, je vytvorená nová inštancia objektu.

S anonymnými objektmi, ako sú vnútorné triedy, môžeme upravovať premenné predtým deklarované v rozsahu. Je to preto, že Kotlin nemá efektívne konečné obmedzenie, aké sme v Jave očakávali.

Teraz pridajme a changeDefaultPowerOnColor v našom Vypínač namietajte a nazvite to:

val powerSwitch = object: Switcher {// ... fun changeDefaultPowerOnColor () {defaultColor = "Yellow"}} powerSwitch.changeDefaultPowerOnColor () log.debug ("defaultColor zmenený vo vnútri powerSwitch" + "anonymného objektu na $ defaultColor")

Uvidíme taký výstup:

... [main] DEBUG c.b.n.Computer - defaultColor zmenený vo vnútri powerSwitch anonymného objektu na Yellow

Upozorňujeme tiež, že ak je náš objekt inštanciou rozhrania alebo triedy pomocou jednej abstraktnej metódy; môžeme ho vytvoriť pomocou výrazu lambda.

6. Vnorené triedy

A posledný, môžeme definovať triedu v inej triede bez kľúčové slovo vnútorné:

trieda Počítač (model valcov: String) {trieda MotherBoard (výrobca valcov: String)}

V tomto type triedy nemáme prístup k inštancii vonkajšej triedy. Ale máme prístup sprievodný objekt členovia prihlasovacej triedy.

Definujme teda a sprievodný objekt vo vnútri nášho Počítač triedy to vidieť:

sprievodný objekt {const val originCountry = "China" fun getBuiltDate (): String {return "2018-07-15T01: 44: 25.38Z"}}

A potom metóda vo vnútri MotherBoard získať informácie o nej a vonkajšej triede:

fun getInfo () = "Vytvorené výrobcom $ - $ originCountry - $ {getBuiltDate ()}"

Teraz ho môžeme otestovať a zistiť, ako to funguje:

@Test fun givenMotherboard_whenGetInfo_thenGetInstalledAndBuiltDetails () {val motherBoard = Computer.MotherBoard ("MotherBoard Inc.") assertThat (motherBoard.getInfo ()) .isEqualTo ("Vyrobený spoločnosťou MotherBoard Inc. nainštalovaný v Číne - 2018-05-23")}

Ako vidíme, tvoríme matka doska bez inštancie Počítač trieda.

7. Záver

V tomto článku sme videli, ako definovať a používať vnorené a vnútorné triedy v Kotline, aby bol náš kód stručnejší a zapuzdrený.

Videli sme tiež určité podobnosti s príslušnými konceptmi Java.

Plne funkčný príklad tohto tutoriálu nájdete na GitHub.