Kotlin ugniježđeni i unutarnji razredi

1. Uvod

U ovom ćemo uputstvu pogledati četiri načina za stvaranje ugniježđenih i unutarnjih klasa u Kotlinu.

2. Brza usporedba s Javom

Za one koji razmišljaju o Java ugniježđenim klasama, napravimo kratki pregled povezanih pojmova:

KotlinJava
Unutarnja nastavaNestatične ugnježđene klase
Lokalni razrediLokalni razredi
Anonimni predmetiAnonimni razredi
Ugniježdeni razrediStatični ugniježđeni razredi

Iako zasigurno nije identična, ovu tablicu možemo koristiti kao vodič pri razmišljanju o mogućnostima i slučajevima korištenja za svaku.

3. Unutarnja nastava

Prvo, možemo deklarirati klasu unutar druge klase pomoću ključne riječi unutarnji.

Ovi razredi imaju pristup članovima zatvorene klase, čak i privatnim članovima.

Da bismo je koristili, prvo moramo stvoriti instancu vanjske klase; bez nje ne možemo koristiti unutarnju nastavu.

Stvorimo a Tvrdi disk unutarnja klasa unutar a Računalo razred:

klasa Računalo (val model: String) {unutarnja klasa HardDisk (val sizeInGb: Int) {fun getInfo () = "Instalirano na $ {[email protected]} s $ sizeInGb GB"}}

Imajte na umu da koristimo kvalificirani ovaj izraz za pristup članovima Računalo razreda, što je slično kao i mi Računalo.ovo u Java ekvivalentu Tvrdi disk.

Pogledajmo sada na djelu:

@Test zabave givenHardDisk_whenGetInfo_thenGetComputerModelAndDiskSizeInGb () {val hardDisk = Računalo ("Desktop"). HardDisk (1000) assertThat (hardDisk.getInfo ()) .isEqualTo ("Instalirano na računalo (model = Desktop) s 1000 GB")

4. Lokalni unutarnji razredi

Dalje, možemo definirati klasu unutar tijela metode ili u bloku opsega.

Napravimo brzi primjer da vidimo kako to funkcionira.

Prvo, definirajmo a powerOn metoda za naš Računalo razred:

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

Unutar powerOn metoda proglasimo a Led predavanja i trepnite:

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

Imajte na umu da je opseg Led klasa je samo unutar metode.

S lokalnim unutarnjim klasama možemo pristupiti i mijenjati varijable deklarirane u vanjskom opsegu. Dodajmo a defaultColor u powerOn metoda:

zabava powerOn (): Niz {var defaultColor = "Blue" // ...} 

Dodajmo sada a changeDefaultPowerOnColor u našem Led razred:

klasa Led (val boja: Niz) {// ... zabava changeDefaultPowerOnColor () {defaultColor = "Violet"}} val powerLed = Led ("Zelena") log.debug ("defaultColor je $ defaultColor") powerLed.changeDefaultPowerOnColor ( ) log.debug ("defaultColor promijenjen unutar Led" + "klase u $ defaultColor")

Koji izlazi:

[main] DEBUG c.b.n.Computer - defaultColor je plava [main] DEBUG c.b.n.Computer - defaultColor promijenjena unutar Led klase u Violet

5. Anonimni predmeti

Anonimni objekti mogu se koristiti za definiranje implementacije sučelja ili apstraktne klase bez stvaranja ponovne upotrebe.

Velika je razlika između anonimnih objekata u Kotlinu i anonimnih unutarnjih klasa na Javi anonimni objekti mogu implementirati više sučelja i metoda.

Prvo, dodajte a Prekidač sučelje u našem Računalo razred:

Switcher sučelja {fun on (): String}

Sada, dodajmo implementaciju ovog sučelja unutar powerOn metoda:

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

Kao što vidimo, definirati našeg anonimca prekidač za napajanje objekt koristimo objektni izraz. Također, moramo uzeti u obzir da se svaki put kada se pozove izraz objekta stvori nova instanca objekta.

Anonimnim objektima poput unutarnjih klasa možemo mijenjati varijable prethodno deklarirane u opsegu. To je zato što Kotlin nema efektivno konačno ograničenje kakvo smo očekivali u Javi.

Dodajmo sada a changeDefaultPowerOnColor u našem Prekidač za napajanje objekt i nazovite ga:

val powerSwitch = objekt: Switcher {// ... zabava changeDefaultPowerOnColor () {defaultColor = "Yellow"}} powerSwitch.changeDefaultPowerOnColor () log.debug ("defaultColor promijenjen unutar powerSwitch" + "anonimni objekt u $ defaultColor")

Vidjet ćemo izlaz poput ovog:

... [glavna] DEBUG c.b.n.računalo - zadana Boja je promijenjena unutar powerSwitch anonimni objekt na Yellow

Također imajte na umu da ako je naš objekt instanca sučelja ili klase s jednom apstraktnom metodom; možemo ga stvoriti pomoću lambda izraza.

6. Ugniježdeni razredi

I zadnji, možemo definirati klasu unutar druge klase bez ključna riječ unutarnji:

klasa Računalo (val model: String) {klasa Matična ploča (proizvođač valuta: String)}

U ovoj vrsti klase nemamo pristup vanjskoj instanci klase. Ali, možemo pristupiti objekt pratilac pripadnici ograde.

Dakle, definirajmo a objekt pratilac unutar našeg Računalo razred da to vidi:

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

A onda unutra metoda Matična ploča da biste dobili informacije o njemu i vanjskoj klasi:

zabava getInfo () = "Izradio $ proizvođač - $ originCountry - $ {getBuiltDate ()}"

Sada ga možemo testirati da vidimo kako to funkcionira:

@Test zabava givenMotherboard_whenGetInfo_thenGetInstalledAndBuiltDetails () {val motherBoard = Computer.MotherBoard ("MotherBoard Inc.") assertThat (motherBoard.getInfo ()) .isEqualTo ("Made by MotherBoard Inc. instaliran u Kini - 2018-05-23")

Kao što vidimo, stvaramo matična ploča bez primjera Računalo razred.

7. Zaključak

U ovom smo članku vidjeli kako definirati i koristiti ugniježđene i unutarnje klase u Kotlinu kako bi naš kôd bio sažetiji i inkapsulirani.

Također, vidjeli smo neke sličnosti s odgovarajućim Java konceptima.

Potpuno radni primjer ovog vodiča možete pronaći na GitHubu.