Altere o tipo com typealias

Tempo de leitura: 2 minutes

Quando as definições de tipo desviam o significado do seu código porque não são legíveis, expressivos ou simplesmente muito longos, o Kotlin tem o recurso certo para você: typealias! Typealias permite fornecer nomes alternativos para classes ou tipos de funções sem introduzir um novo tipo.

 

Uso de Typealias

Você pode usar aliases de tipo para nomear um tipo de função:

typealias TeardownLogic = () -> Unit
fun onCancel(teardown : TeardownLogic){ }

private typealias OnDoggoClick = (dog: Pet.GoodDoggo) -> Unit
val onClick: OnDoggoClick

A desvantagem disso é que o nome oculta os parâmetros passados para a função, diminuindo a legibilidade:

typealias TeardownLogic = () -> Unit //or
typealias TeardownLogic = (exception: Exception) -> Unit

fun onCancel(teardown : TeardownLogic){
// não consigo ver facilmente quais informações temos
// disponível em TeardownLogic
}

Typealias permite encurtar nomes genéricos longos:

typealias Doggos = List<Pet.GoodDoggo>

fun train(dogs: Doggos){ … }

Embora isso seja possível, pergunte-se se realmente deve fazê-lo. Usar um alias de tipo realmente torna seu código mais significativo e legível?

Pergunte a si mesmo se o uso de um alias de tipo torna seu código mais compreensível.

Se você estiver trabalhando com um nome de classe longo, pode usar typealias para encurtá-lo:

typealias AVD = AnimatedVectorDrawable

Mas, para este caso de uso, um ajuste melhor seria usar um alias de importação:

import android.graphics.drawable.AnimatedVectorDrawable as AVD

Nesse caso, usar um atalho não ajuda muito a aumentar a legibilidade e o IDE ajudaria a preencher automaticamente o nome da classe.

Mas, aliases de importação se tornam especialmente úteis quando você precisa desambiguar entre classes com o mesmo nome, provenientes de pacotes diferentes:

import io.plaidapp.R as appR

import io.plaidapp.about.R

Os apelidos de tipo são definidos fora das classes, portanto, certifique-se de considerar sua visibilidade ao usá-los.

 

Uso de Typealias em projetos multiplataforma

Ao trabalhar com projetos de plataforma múltipla, você pode especificar interfaces no código comum que são então implementadas no código da plataforma. Para tornar isso mais fácil, o Kotlin fornece um mecanismo de declarações esperadas e reais.

As interfaces no código comum são as declarações esperadas, definidas usando a palavra-chave expect. A implementação no código da plataforma é definida usando a palavra-chave actual. Se a implementação já existe em uma das plataformas e tem todos os métodos esperados com exatamente as mesmas assinaturas, então você pode usar typealias para mapear o nome da classe para o nome esperado.

expect annotation class Test

actual typealias Test = org.junit.Test

 

Sob o hood

Os aliases de tipo não introduzem novos tipos. Por exemplo, o código descompilado para a função train usará apenas uma Lista:

// Kotlin
typealias Doggos = List<Pet.GoodDoggo>
fun train(dogs: Doggos) { … }

// Decompiled Java code
public static final void train(@NotNull List dogs) { … }

Os aliases de tipo não introduzem novos tipos.

Você não deve confiar em aliases de tipo para verificações de tipo em tempo de compilação. Em vez disso, você deve considerar o uso de um tipo diferente ou uma classe embutida. Por exemplo, digamos que temos a seguinte função:

fun play(dogId: Long)

Criar um alias de tipo para Long não nos ajuda a evitar erros quando estamos tentando passar o id errado:

typealias DogId = Long

fun pet(dogId: DogId) { … }

fun usage() {
    val cat = Cat(1L)
    pet(cat.catId) // compiles
}

Os apelidos de tipo são uma forma de fornecer um nome mais curto ou mais significativo para um tipo existente. Se o que você está procurando é segurança adicional, provavelmente deseja criar um novo tipo.

Visits: 1 Visits: 1194591