Inline órák Kotlinban

1. Áttekintés

A Kotlin 1.3+ verzióban van egy kísérleti új típusú osztályunk, az úgynevezett inline osztály. Ebben az oktatóanyagban az inline osztályok használatára és azok néhány korlátozására összpontosítunk.

2. Beállítás

Mint korábban említettük, a soros osztályok Kotlin kísérleti jellemzői. Ennek következtében a fordító a-t dobja Figyelem jelezve a jellemző kísérleti állapotát.

A figyelmeztetés elkerülése érdekében hozzáadhatjuk a következő Maven fordító opciót a konfigurációnkhoz:

  -XXLanguage: + InlineClasses 

3. Mik azok a soron belüli osztályok?

Az inline osztályok lehetőséget kínálnak egy típus beburkolására, ezáltal hozzáadva a funkcionalitást és létrehozva egy új típust.

A hagyományos (nem betétes) burkolókkal szemben a javított teljesítmény előnyeit élvezheti. Ez azért történik, mert az adatok be vannak ágyazva a felhasználásába, és az objektum példányosítása átugrik a kapott összeállított kódban.

Lássunk egy példát az úgynevezett soros osztályra InlinesCircleRadius típusú tulajdonsággal Kettős a sugarat képviselve:

val circleRadius = InlinesCircleRadius (5.5)

A JVM számára a kódunk valójában csak:

val körRadius = 5,5

Figyeljük meg, hogy a mi InlinesCircleRadius nem példányosodik a lefordított kódban, mert a mögöttes érték be van vonva, így felmentve minket a példányosítással járó teljesítménybüntetések alól.

3.1. Felhasználási példa

Most, hogy tudjuk, mi az inline osztály, megvitatjuk azok használatát.

Az elsődleges konstruktorban inicializált egyetlen tulajdonság az alapkövetelménysoros osztály. Az egyetlen tulajdonság futás közben képviseli az osztálypéldányt.

Ezért a helyes meghatározás érdekében egyetlen kódsort használhatunk:

inline osztály InlineDoubleWrapper (val doubleValue: Double)

Meghatároztuk InlineDoubleWrapper mint egyszerű burkoló a Kettős objektumot és alkalmazta a Sorban kulcsszó hozzá. Végül most ezt az osztályt használhatjuk kódunkban további változtatások nélkül:

@Test fun whenInclineClassIsUsed_ThenPropertyIsReadCorrectly () {val piDoubleValue = InlineDoubleWrapper (3.14) assertEquals (3.14, piDoubleValue.doubleValue)}

4. Osztálytagok

Eddig inline osztályokat használtunk, mint az egyszerű burkolókat. De ennél sokkal több. Lehetővé teszik számunkra a tulajdonságok és függvények definiálását, akárcsak a reguláris osztályok. Ez a következő példa meghatároz egy tulajdonságot, amely az átmérőt képviseli, és egy függvényt, amely visszaadja a kör területét:

inline osztály CircleRadius (privát val circleRadius: Double) {val átmérőOfCircle get () = 2 * circleRadius szórakoztató területOfCircle = 3,14 * körRadius * körRadius}

Most létrehozunk egy tesztet kör átmérője ingatlan. Ez példányosítja a mi CircleRadius inline osztály, majd hívja az ingatlant:

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

És itt van egy egyszerű teszt a areaOfCircle funkció:

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

Van azonban néhány korlátozás abban, hogy mit határozhatunk meg és mit nem határozhatunk meg az inline osztályokon belül. Bár a tulajdonságok és a funkciók megengedettek, ezt meg kell említenünk benne blokkok, belső osztályok és háttérmezők nem.

5. Öröklés

Fontos ezt megemlíteni az inline osztályok csak interfészektől örökölhetnek, és mivel nem lehetnek alosztályunk, az inline órák is gyakorlatilag véglegesek.

Adott felület Rajzolható módszerrel húz(), ezt a módszert a mi CircleRadius osztály:

interfész Rajzolható {fun draw ()} inline osztály CircleRadius (privát val circleRadius: Double): Rajzolható {val diametreOfCircle get () = 2 * circleRadius fun areaOfCircle () = 3,14 * circleRadius * circleRadius felülírja a fun draw () {println ("Draw az én köröm ")}}

6. Következtetések

Ebben a gyors cikkben Kotlinban folyó soros osztályokat tártunk fel. Emellett beszéltünk az öröklésről, valamint a tulajdonságok és a funkciók meghatározásáról.

Szokás szerint ezek a példák és részletek megtalálhatók a GitHubon.