Kotlin Academy · Aula

Limitações

O que as classes de valor não podem fazer

Aula 4 de 413 etapas

Limitações é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.

Conhecendo os limites

As classes de valor são poderosas, mas têm restrições. Entender seus limites ajuda você a escolher a ferramenta certa e evitar surpresas.

Exatamente uma propriedade

Uma classe de valor encapsula um único valor. Para agrupar vários campos, você precisa de uma classe comum ou de uma data class.

// @JvmInline value class Range(val lo: Int, val hi: Int) // not allowed

data class Range(val lo: Int, val hi: Int)

fun main() {
    println(Range(1, 10))
}

Nenhum estado de inicialização além do valor

As classes de valor não podem ter campos de armazenamento além da única propriedade do construtor. Um estado adicional var com um campo de armazenamento não é permitido.

@JvmInline
value class Counter(val value: Int) {
    // val cached: Int = value * 2  // not allowed: extra backing field
    val doubled: Int get() = value * 2  // computed is fine
}

fun main() {
    println(Counter(3).doubled)
}

Sem herança

As classes de valor são implicitamente final. Elas não podem estender outras classes nem ser estendidas. Elas só podem implementar interfaces.

interface Named { val label: String }

@JvmInline
value class Tag(val text: String) : Named {
    override val label: String get() = text
}

fun main() {
    println(Tag("urgent").label)
}

O custo do encaixotamento retorna

A promessa de custo zero desaparece quando o valor é usado como tipo anulável, genérico ou de interface. O compilador então o encaixota em um objeto real.

@JvmInline
value class Id(val raw: Int)

fun main() {
    val list: List<Id> = listOf(Id(1), Id(2)) // boxed inside the list
    println(list.map { it.raw })
}

Sem identidade

As classes de valor não têm uma identidade referencial estável. A igualdade referencial com === não tem significado, e elas não podem ser usadas onde a identidade do objeto importa, como em um bloqueio de sincronização.

@JvmInline
value class Code(val value: Int)

fun main() {
    val a = Code(5)
    val b = Code(5)
    println(a == b)   // structural equality works
}

Não pode ser inicializada tardiamente nem delegada

Você não pode aplicar lateinit ao valor subjacente, e as classes de valor não oferecem delegação de propriedades em seu único campo. O valor deve ser definido no construtor.

@JvmInline
value class Slug(val value: String)

fun main() {
    val s = Slug("hello-world") // must be provided up front
    println(s.value)
}

Alteração de nomes na JVM

Na JVM, as funções que recebem parâmetros de classes de valor têm nomes alterados no código de bytes para evitar conflitos. Isso complica a interoperabilidade com Java; os chamadores Java podem não enxergá-las corretamente.

@JvmInline
value class Hz(val value: Int)

fun tune(freq: Hz) = freq.value

fun main() {
    println(tune(Hz(440))) // simple from Kotlin; mangled from Java
}

Não serve para invólucros com vários campos

Se você perceber que gostaria de ter duas propriedades, uma classe de valor é a ferramenta errada. Use uma data class, aceitando a alocação em troca de uma estrutura mais rica.

data class Coordinate(val lat: Double, val lng: Double)

fun main() {
    println(Coordinate(41.0, 29.0))
}

Resumo das limitações

As classes de valor não podem:

  • Conter mais de uma propriedade
  • Ter campos de armazenamento adicionais ou lateinit
  • Herdar de classes nem ser herdadas por elas
  • Oferecer identidade referencial
  • Evitar sempre o encaixotamento

Escolhendo com sabedoria

Use uma classe de valor para um valor único, validado e seguro quanto ao tipo. Use uma classe de dados para dados agrupados. Use um alias de tipo para obter apenas legibilidade, sem segurança. Cada opção tem seu lugar.

Verificação rápida

Teste sua compreensão sobre as limitações das classes de valor.

Recapitulação

Você aprendeu as limitações das classes de valor:

  • Uma única propriedade, sem campos de armazenamento adicionais
  • Sem herança e sem identidade
  • O encaixotamento retorna no uso anulável, genérico ou como interface
  • A alteração de nomes na JVM complica a interoperabilidade com Java

Escolha a ferramenta de acordo com a necessidade.

Grátis para começar

Aprenda Kotlin com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
51
Aulas
203

Perguntas Frequentes

A aula “Limitações” é grátis?

Sim — o texto completo de “Limitações” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.

O que vou aprender em “Limitações”?

O que as classes de valor não podem fazer Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Kotlin Academy?

Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Limitações”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Kotlin Academy?

Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Apelidos de Tipos
  2. Classes de Valor Embutidas
  3. Casos de Uso
  4. Limitações
← Voltar para Kotlin Academy