Inline klasser i Kotlin

1. Oversikt

I Kotlin 1.3+ har vi en eksperimentell ny type klasse, kalt inline-klasse. I denne opplæringen vil vi fokusere på bruken av inline-klasser og også noen av deres begrensninger.

2. Oppsett

Som vi nevnte tidligere, er inline-klasser et eksperimentelt trekk ved Kotlin. Som en konsekvens vil kompilatoren kaste et advarsel som indikerer funksjonens eksperimentelle status.

For å unngå denne advarselen kan vi legge til følgende Maven-kompilatoralternativ i vår konfigurasjon:

  -XXLanguage: + InlineClasses 

3. Hva er integrerte klasser?

Inline-klasser gir oss en måte å pakke inn en type, og dermed legge til funksjonalitet og skape en ny type i seg selv.

I motsetning til vanlige (ikke-inline) innpakninger, vil de ha nytte av forbedret ytelse. Dette skjer fordi dataene er innebygd i dets bruk, og objektinstansiering hoppes over i den resulterende kompilerte koden.

La oss se et eksempel på en inline-klasse som heter InlinedCircleRadius med en egenskap av typen Dobbelt som representerer radiusen:

val circleRadius = InlinedCircleRadius (5.5)

For JVM er koden vår faktisk bare:

val sirkelRadius = 5,5

Legg merke til hvordan vår InlinedCircleRadius er ikke instantiert i den kompilerte koden fordi den underliggende verdien er inline, og frigjør oss fra ytelsesstraffene som er forbundet med instantiering.

3.1. Brukseksempel

Nå som vi vet hva inline-klasser er, vil vi diskutere bruken av dem.

En enkelt eiendom initialisert i den primære konstruktøren er det grunnleggende kravet til eninline-klasse. Den eneste egenskapen vil representere klasseinstansen ved kjøretid.

Derfor, for å ha en riktig definisjon, kan vi bruke en enkelt kodelinje:

inline klasse InlineDoubleWrapper (val doubleValue: Double)

Vi definerte InlineDoubleWrapper som en enkel innpakning over en Dobbelt objekt og brukte på linje nøkkelord til den. Endelig kan vi nå bruke denne klassen i koden vår uten ytterligere endringer:

@Test moro nårInclineClassIsUsed_ThenPropertyIsReadCorrectly () {val piDoubleValue = InlineDoubleWrapper (3.14) assertEquals (3.14, piDoubleValue.doubleValue)}

4. Klassemedlemmer

Fram til nå brukte vi inline-klasser akkurat som enkle innpakninger. Men de er så mye mer enn det. De lar oss også definere egenskaper og funksjoner akkurat som vanlige klasser. Dette neste eksemplet definerer en eiendom som representerer diameteren og en funksjon for å returnere sirkelområdet:

inline-klasse CircleRadius (privat val sirkelRadius: Dobbel) {val diameterOfCircle get () = 2 * sirkelRadius moroområdeOfCircle = 3,14 * sirkelRadius * sirkelRadius}

Vi skal nå lage en test for vår diameterOfCircle eiendom. Det vil instantiere vår CircleRadius inline-klasse og ring deretter eiendommen:

@Test fun givenRadius_ThenDiameterIsCorrectlyCalculated () {val radius = CircleRadius (5.0) assertEquals (10.0, radius.diameterOfCircle)}

Og her er en enkel test for areaOfCircle funksjon:

@Test fun givenRadius_ThenAreaIsCorrectlyCalculated () {val radius = CircleRadius (5.0) assertEquals (78.5, radius.areaOfCircle ())}

Imidlertid er det noen begrensninger på hva vi kan og ikke kan definere i våre inline-klasser. Selv om egenskaper og funksjoner er tillatt, må vi nevne det i det blokker, indre klasser og støttefelt er ikke.

5. Arv

Det er viktig å nevne det inline-klasser kan bare arve fra grensesnitt, og siden vi ikke kan ha underklasser, integrerte klasser er også effektivt endelige.

Gitt et grensesnitt Tegnes med en metode tegne(), vil vi implementere denne metoden i vår CircleRadius klasse:

grensesnitt Drawable {fun draw ()} inline class CircleRadius (private val circleRadius: Double): Drawable {val diameterOfCircle get () = 2 * circleRadius fun areaOfCircle () = 3.14 * circleRadius * circleRadius override fun draw () {println ("Draw kretsen min ")}}

6. Konklusjoner

I denne raske artikkelen utforsket vi inline-klasser i Kotlin. I tillegg snakket vi om arv og definisjonen av egenskaper og funksjoner.

Som vanlig kan du finne alle disse eksemplene og utdragene på GitHub.


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