Aulas em linha em Kotlin

Aulas em linha em Kotlin

1. Visão geral

No Kotlin 1.3+, temos um novo tipo experimental de classe, chamadoinline class. Neste tutorial, vamos nos concentrar no uso de classes inline e também em algumas de suas limitações.

2. Configuração

Como mencionamos anteriormente, as classes embutidas são um recurso experimental do Kotlin. Como consequência, o compilador lançará umwarning indicando o status experimental do recurso.

Para evitar esse aviso, podemos adicionar o seguinteMaven compiler option à nossa configuração:


    
        -XXLanguage:+InlineClasses
    

3. O que são Classes Inline

As classes embutidas nos fornecem uma maneira de agrupar um tipo, adicionando funcionalidade e criando um novo tipo por si só.

Ao contrário dos invólucros comuns (não embutidos), eles se beneficiarão do desempenho aprimorado. Isso acontece porque os dados são incorporados a seus usos e a instanciação do objeto é ignorada no código compilado resultante.

Vejamos um exemplo de uma classe inline chamadaInlinedCircleRadius com uma propriedade do tipoDouble representando o raio:

val circleRadius = InlinedCircleRadius(5.5)

Para a JVM, nosso código é realmente apenas:

val circleRadius = 5.5

Observe como nossoInlinedCircleRadius não é instanciado no código compilado porque o valor subjacente é embutido, nos livrando das penalidades de desempenho associadas à instanciação.

3.1. Exemplo de uso

Agora que sabemos o que são classes inline, discutiremos seu uso.

A single property initialized in the primary constructor is the basic requirement of aninline class. A única propriedade representará a instância da classe em tempo de execução.

Portanto, para ter uma definição correta, podemos usar uma única linha de código:

inline class InlineDoubleWrapper(val doubleValue : Double)

DefinimosInlineDoubleWrapper como um invólucro simples sobre um objetoDouble e aplicamos a palavra-chaveinline a ele. Finalmente, agora podemos usar essa classe em nosso código sem alterações adicionais:

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

4. Membros da classe

Até agora, usamos classes inline, como wrappers simples. Mas eles são muito mais que isso. They also allow us to define properties and functions just like regular classes. Este próximo exemplo define uma propriedade que representa o diâmetro e uma função para retornar a área do círculo:

inline class CircleRadius(private val circleRadius : Double) {
    val diameterOfCircle get() = 2 * circleRadius
    fun areaOfCircle = 3.14 * circleRadius * circleRadius
}

Vamos agora criar um teste para nossa propriedadediameterOfCircle. Ele instanciará nossa classe embutidaCircleRadius e chamará a propriedade:

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

E aqui está um teste simples para a funçãoareaOfCircle:

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

No entanto, existem algumas limitações sobre o que podemos e não podemos definir dentro de nossas classes inline. While properties and functions are allowed, we have to mention that init blocks, inner classes, and backing fields are not.

5. Herança

É importante mencionar queinline classes can inherit only from interfaces, e como não podemos ter subclasses,inline classes are also effectively final.

Dada uma interfaceDrawable com um métododraw(), vamos implementar este método em nossa classeCircleRadius:

interface 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 my circle")
    }
}

6. Conclusões

Neste artigo rápido, exploramos as classes embutidas no Kotlin. Além disso, falamos sobre herança e a definição de propriedades e funções.

Como de costume, todos esses exemplos e fragmentos podem ser encontradosover on GitHub.