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.