Kotlin beágyazott és belső osztályok

1. Bemutatkozás

Ebben az oktatóanyagban négy módot fogunk megvizsgálni a beágyazott és belső osztályok létrehozására Kotlinban.

2. Gyors összehasonlítás a Java-val

Azok számára, akik a Java beágyazott osztályaira gondolnak, végezzük el a kapcsolódó kifejezések gyors áttekintését:

KotlinJáva
Belső osztályokNem statikus beágyazott osztályok
Helyi osztályokHelyi osztályok
Névtelen objektumokNévtelen osztályok
Beágyazott osztályokStatikus beágyazott osztályok

Bár természetesen nem azonos, ezt a táblázatot útmutatóként használhatjuk, amikor az egyes képességekre és felhasználási esetekre gondolunk.

3. Belső osztályok

Először deklarálhatunk egy osztályt egy másik osztályon belül a kulcsszóval belső.

Ezek az osztályok hozzáférhetnek a bezáró osztály tagjaihoz, még a magántagokhoz is.

Használatához először létre kell hoznunk a külső osztály egy példányát; nem használhatunk belső osztályokat anélkül.

Hozzunk létre egy Merevlemez belső osztály belsejében a Számítógép osztály:

osztályú számítógép (val modell: karakterlánc) {belső osztályú merevlemez (val sizeInGb: Int) {fun getInfo () = "Telepítve a $ {[email protected]} -re $ sizeInGb GB-tal"}}

Vegye figyelembe, hogy minősítetten használjuk ezt a kifejezést a Számítógép osztály, ami hasonló, mint mi Számítógép.ez Java megfelelőjében Merevlemez.

Most lássuk működés közben:

@Test fun givenHardDisk_whenGetInfo_thenGetComputerModelAndDiskSizeInGb () {val hardDisk = Computer ("Desktop"). HardDisk (1000) assertThat (hardDisk.getInfo ()) .isEqualTo ("Telepítve a számítógépre (modell = Asztal)" 1000 GB-tal

4. Helyi belső osztályok

Ezután meghatározhatunk egy osztályt a metódus törzsében vagy egy hatókörblokkban.

Készítsünk egy gyors példát, hogy lássuk, hogyan működik.

Először definiáljuk a bekapcsolás módszer a mi Számítógép osztály:

fun powerOn (): Karakterlánc {// ...}

A bekapcsolás módszerrel nyilvánítsuk ki a Vezette osztály és villogjon:

fun powerOn (): String {osztály Led (val szín: String) {fun blink (): String {return "villogó $ color"}} val powerLed = Led ("zöld") return powerLed.blink ()}

Ne feledje, hogy a Vezette osztály csak a módszer belsejében van.

Helyi belső osztályokkal hozzáférhetünk és módosíthatjuk a külső hatókörben deklarált változókat. Tegyük hozzá a defaultColor ban,-ben bekapcsolás módszer:

fun powerOn (): String {var defaultColor = "Kék" // ...} 

Most tegyünk hozzá egy changeDefaultPowerOnColor miénkben Vezette osztály:

class Led (val color: String) {// ... fun changeDefaultPowerOnColor () {defaultColor = "Violet"}} val powerLed = Led ("Zöld") log.debug ("defaultColor is $ defaultColor") powerLed.changeDefaultPowerOnColor ( ) log.debug ("A defaultColor a Led" + "osztályban $ defaultColor-ra változott)

Mely kimenetek:

[main] DEBUG c.b.n.Computer - defaultColor kék [main] DEBUG c.b.n.Computer - defaultColor Led osztályon belül Violet

5. Névtelen objektumok

Névtelen objektumok használhatók egy felület vagy egy absztrakt osztály megvalósításának meghatározására újrafelhasználható megvalósítás létrehozása nélkül.

Nagy különbség van a Kotlinban található anonim objektumok és a Java névtelen belső osztályai között az anonim objektumok több interfészt és módszert is megvalósíthatnak.

Először tegyünk hozzá egy Váltó felület a mi Számítógép osztály:

interfész kapcsoló {fun on (): String}

Most tegyük hozzá ennek a felületnek a megvalósítását a bekapcsolás módszer:

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

Mint láthatjuk, hogy meghatározzuk anonim hálózati kapcsoló objektum objektum kifejezést használunk. Azt is figyelembe kell vennünk, hogy minden alkalommal, amikor az objektumkifejezést meghívják, az objektum új példánya jön létre.

Névtelen objektumokkal, például belső osztályokkal, módosíthatjuk a hatókörben korábban deklarált változókat. Kotlinnak ugyanis nincs meg az a tényleges végső korlátozása, amire számítottunk a Java-ban.

Most tegyünk hozzá egy changeDefaultPowerOnColor miénkben Hálózati kapcsoló objektum és hívja:

val powerSwitch = object: Switcher {// ... fun changeDefaultPowerOnColor () {defaultColor = "Sárga"}} powerSwitch.changeDefaultPowerOnColor () log.debug ("defaultColor megváltozott a powerSwitch belsejében" + "névtelen objektum $ defaultColor")

Látni fogunk egy ilyen kimenetet:

... [main] DEBUG c.b.n.Computer - defaultColor megváltozott a powerSwitch névtelen objektumára sárga

Ezenkívül vegye figyelembe, hogy ha az objektumunk egy felület vagy egy osztály példánya egyetlen elvont módszerrel; lambda kifejezéssel létrehozhatjuk.

6. Beágyazott osztályok

És utolsó, osztályt definiálhatunk egy másik osztályon belül nélkül a belső kulcsszó:

osztályú számítógép (val modell: String) {osztály alaplap (val gyártó: String)}

Ebben a típusú osztályban nincs hozzáférésünk a külső osztálypéldányhoz. De hozzáférhetünk társ tárgy a záróosztály tagjai.

Tehát, definiáljuk a társ tárgy bennünk Számítógép osztály látni:

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

És akkor egy módszer belül Alaplap hogy információkat szerezzünk róla és a külső osztályról:

fun getInfo () = "Készítette: $ gyártó - $ originCountry - $ {getBuiltDate ()}"

Most kipróbálhatjuk, hogy hogyan működik:

@Test fun givenMotherboard_whenGetInfo_thenGetInstalledAndBuiltDetails () {val motherBoard = Computer.MotherBoard ("MotherBoard Inc.") assertThat (motherBoard.getInfo ()) .isEqualTo ("Kínában telepítette MotherBoard Inc. - 2018-05-23"}

Mint láthatjuk, alkotunk alaplap példánya nélkül Számítógép osztály.

7. Következtetés

Ebben a cikkben azt láthattuk, hogyan definiálhatjuk és használhatjuk a beágyazott és belső osztályokat Kotlinban, hogy tömörebbé és beágyazottabbá tegyük kódunkat.

Emellett láttunk néhány hasonlóságot a megfelelő Java fogalmakkal.

Ennek az oktatóanyagnak egy teljesen működő példája megtalálható a GitHub oldalon.