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:
Kotlin | Java |
---|---|
Unutarnja nastava | Nestatične ugnježđene klase |
Lokalni razredi | Lokalni razredi |
Anonimni predmeti | Anonimni razredi |
Ugniježdeni razredi | Statič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.