Classes de Valor Embutidas
Encapsule sem sobrecarga
Classes de Valor Embutidas é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 2 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.
O problema do encapsulamento
Encapsular um tipo primitivo em uma classe adiciona segurança de tipos, mas normalmente custa uma alocação na memória de heap. As classes de valor oferecem essa segurança enquanto o compilador remove o encapsulamento quando possível.
Declarando uma classe de valor
Marque uma classe @JvmInline value class com exatamente uma propriedade no construtor primário. Ela se comporta como um tipo distinto.
@JvmInline
value class Password(val value: String)
fun main() {
val p = Password("secret")
println(p.value)
}Um tipo distinto
Ao contrário de um alias de tipo, uma classe de valor é um tipo separado. Você não pode passar acidentalmente uma String simples onde se espera uma Password.
@JvmInline
value class Password(val value: String)
fun login(p: Password) = println("login with " + p.value)
fun main() {
login(Password("hunter2"))
}Custo zero
Durante a execução, o compilador geralmente embute o valor subjacente, portanto não há alocação adicional de objetos. Na maioria dos caminhos de execução, uma Password é representada como uma String simples.
@JvmInline
value class Meters(val amount: Double)
fun main() {
val d = Meters(5.0)
println(d.amount) // stored inline as a Double
}Métodos e propriedades
As classes de valor podem ter funções e propriedades calculadas, assim como as classes normais.
@JvmInline
value class Celsius(val degrees: Double) {
fun toFahrenheit() = degrees * 9 / 5 + 32
}
fun main() {
println(Celsius(100.0).toFahrenheit())
}Blocos init para validação
Um bloco init permite validar o valor encapsulado durante a construção, garantindo que cada instância seja válida.
@JvmInline
value class Percentage(val value: Int) {
init {
require(value in 0..100) { "out of range" }
}
}
fun main() {
println(Percentage(75).value)
}Propriedades calculadas
Você pode adicionar propriedades calculadas derivadas do único valor armazenado, mantendo a lógica próxima do tipo.
@JvmInline
value class Seconds(val value: Int) {
val asMinutes: Double get() = value / 60.0
}
fun main() {
println(Seconds(120).asMinutes)
}Implementando interfaces
As classes de valor podem implementar interfaces, permitindo o uso polimórfico. Observação: isso pode forçar o encaixotamento quando elas são tratadas como o tipo da interface.
interface Describable {
fun describe(): String
}
@JvmInline
value class Money(val cents: Int) : Describable {
override fun describe() = "$" + cents / 100.0
}
fun main() {
println(Money(1599).describe())
}Quando ocorre o encaixotamento
O invólucro reaparece (encaixotamento) quando o valor é usado como anulável, como uma interface ou em uma coleção genérica. Nesses casos, o compilador cria um objeto real — continua correto, apenas menos eficiente.
@JvmInline
value class Id(val raw: Int)
fun main() {
val direct = Id(1) // inlined
val boxed: Id? = Id(2) // boxed because nullable
println("" + direct.raw + " " + boxed?.raw)
}classe de valor vs classe de dados
Uma data class sempre aloca um objeto e pode conter várias propriedades. Uma value class contém exatamente uma e busca não ter custo adicional. Escolha classes de valor para invólucros simples e seguros quanto ao tipo, em torno de um único valor.
Por que isso importa
As classes de valor permitem que você:
- Evite misturar parâmetros com tipos semelhantes
- Associe validação a um tipo primitivo
- Tenha, geralmente, nenhum custo durante a execução
Elas são a solução segura quanto ao tipo quando os aliases não são suficientes.
Verificação rápida
Teste sua compreensão sobre classes de valor embutidas.
Recapitulação
Você aprendeu sobre classes de valor embutidas:
- Declaradas com
@JvmInline value classe uma propriedade - Um tipo distinto, geralmente sem custo adicional
- Suporte a métodos, propriedades calculadas e validação com
init - Ocorre encaixotamento quando são anuláveis, genéricas ou usadas como uma interface
A seguir: casos de uso reais.
Perguntas Frequentes
A aula “Classes de Valor Embutidas” é grátis?
Sim — o texto completo de “Classes de Valor Embutidas” é 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 “Classes de Valor Embutidas”?
Encapsule sem sobrecarga 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 2 de 4.
Quanto tempo leva a aula “Classes de Valor Embutidas”?
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
- Apelidos de Tipos
- Classes de Valor Embutidas
- Casos de Uso
- Limitações