Inline satovi u Kotlinu

1. Pregled

U Kotlinu 1.3+ imamo eksperimentalnu novu vrstu klase, koja se naziva inline klasa. U ovom uputstvu usredotočit ćemo se na upotrebu ugrađenih klasa i također na neka njihova ograničenja.

2. Postavljanje

Kao što smo već spomenuli, inline klase su eksperimentalna značajka Kotlina. Kao posljedica toga, kompajler će baciti a upozorenje ukazujući na eksperimentalni status značajke.

Da bismo izbjegli ovo upozorenje, u našu konfiguraciju možemo dodati sljedeću opciju kompajlera Maven:

  -XXJezik: + InlineClasses 

3. Što su inline satovi?

Inline klase pružaju nam način za umotavanje tipa, dodajući tako funkcionalnost i stvarajući novi tip sam po sebi.

Za razliku od uobičajenih (neinstaliranih) omota, oni će imati koristi od poboljšanih performansi. To se događa zato što se podaci ugrađuju u njegovu upotrebu, a instancija objekta preskače u rezultirajućem kompiliranom kodu.

Pogledajmo primjer ugrađene klase koja se zove InlinedCircleRadius sa svojstvom tipa Dvostruko predstavlja radijus:

val circleRadius = UcrtaniCircleRadius (5,5)

Za JVM naš je kod zapravo samo:

val krugaRadius = 5,5

Primijetite kako naš InlinedCircleRadius nije instanciran u kompajliranom kodu jer je temeljna vrijednost ucrtana, oslobađajući nas kazne za izvedbu povezanu s instancijom.

3.1. Primjer upotrebe

Sad kad znamo što su inline klase, razgovarat ćemo o njihovoj upotrebi.

Jedno svojstvo inicijalizirano u primarnom konstruktoru osnovni je zahtjev aninline razred. Jedno svojstvo predstavljat će instancu klase u vrijeme izvođenja.

Stoga, da bismo imali ispravnu definiciju, možemo koristiti jedan redak koda:

inline klasa InlineDoubleWrapper (val doubleValue: Double)

Mi smo definirali InlineDoubleWrapper kao jednostavan omot preko a Dvostruko objekt i primijenio u redu ključna riječ za to. Napokon, ovu klasu sada možemo koristiti u našem kodu bez dodatnih promjena:

@Test zabave whenInclineClassIsUsed_ThenPropertyIsReadCorrect () {val piDoubleValue = InlineDoubleWrapper (3.14) assertEquals (3.14, piDoubleValue.doubleValue)}

4. Članovi razreda

Do sada smo koristili umetnute satove poput jednostavnih omota. Ali oni su puno više od toga. Omogućuju nam i definiranje svojstava i funkcija poput redovnih klasa. Sljedeći primjer definira svojstvo koje predstavlja promjer i funkciju za vraćanje površine kruga:

inline klasa CircleRadius (privatni val circleRadius: Double) {val диаметрOfCircle get () = 2 * circleRadius zabavno područjeOcCircle = 3,14 * krugRadius * krugRadius}

Sada ćemo stvoriti test za naše promjerOfCircle imovine. Instancirat će naš CircleRadius inline klasu, a zatim pozovite svojstvo:

@Test zabava givenRadius_ThenDiameterIsCorrectCalculated () {val radijus = CircleRadius (5.0) assertEquals (10.0, radius.diameterOfCircle)}

I evo jednostavnog testa za areaOfCircle funkcija:

@Test zabava givenRadius_ThenAreaIsCorrectCalculated () {val radijus = CircleRadius (5.0) assertEquals (78.5, radius.areaOfCircle ())}

Međutim, postoje određena ograničenja onoga što možemo, a što ne možemo definirati unutar svojih inline klasa. Iako su svojstva i funkcije dopuštene, to moramo napomenuti u tome blokovi, unutarnje klase i prateća polja nisu.

5. Nasljeđivanje

Važno je to spomenuti inline klase mogu naslijediti samo iz sučelja, a kako ne možemo imati podrazrede, inline satovi su također učinkovito završni.

S obzirom na sučelje Za crtanje s metodom crtati(), primijenit ćemo ovu metodu u našem CircleRadius razred:

sučelje Drawable {fun draw ()} inline class CircleRadius (private val circleRadius: Double): Drawable {val диаметрOfCircle get () = 2 * circleRadius fun areaOfCircle () = 3.14 * circleRadius * circleRadius nadjačati zabavu draw () {println ("Draw moj krug ")}}

6. Zaključci

U ovom kratkom članku istražili smo inline satove u Kotlinu. Uz to smo razgovarali o nasljeđivanju i definiciji svojstava i funkcija.

Kao i obično, sve ove primjere i isječke možete pronaći na GitHubu.


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