Neste artigo, você aprenderá sobre construtores em Kotlin (construtores primários e secundários), bem como blocos inicializadores com a ajuda de exemplos.
Um construtor é uma maneira concisa de inicializar as propriedades da classe.
É uma função de membro especial que é chamada quando um objeto é instanciado (criado). No entanto, como eles funcionam em Kotlin é um pouco diferente.
Em Kotlin, existem dois construtores:
- Construtor primário - maneira concisa de inicializar uma classe
- Construtor secundário - permite que você coloque lógica de inicialização adicional
Construtor Primário
O construtor primário faz parte do cabeçalho da classe. Aqui está um exemplo:
class Person (val firstName: String, var age: Int) (// corpo da classe)
O bloco de código entre parênteses é o construtor primário: (val firstName: String, var age: Int)
.
O construtor declarou duas propriedades: firstName
(propriedade somente leitura, pois é declarada usando a palavra-chave val
) e age
(propriedade de leitura e escrita quando é declarada com a palavra-chave var
).
Exemplo: construtor primário
fun main(args: Array) ( val person1 = Person("Joe", 25) println("First Name = $(person1.firstName)") println("Age = $(person1.age)") ) class Person(val firstName: String, var age: Int) ( )
Quando você executa o programa, a saída será:
Primeiro nome = Joe Idade = 25
Quando o objecto de Person
classe é criada, "Joe"
e 25
os valores são transmitidos como se Person
representa uma função.
Isso inicializa firstName
e age
propriedades do objeto person1 para "Joe"
e 25
respectivamente.
Existem outras maneiras de usar construtores primários.
Construtor primário e blocos inicializadores
O construtor primário tem uma sintaxe restrita e não pode conter nenhum código.
Para colocar o código de inicialização (não apenas o código para inicializar propriedades), o bloco inicializador é usado. É prefixado com uma init
palavra - chave. Vamos modificar o exemplo acima com o bloco inicializador:
fun main(args: Array) ( val person1 = Person("joe", 25) ) class Person(fName: String, personAge: Int) ( val firstName: String var age: Int // initializer block init ( firstName = fName.capitalize() age = personAge println("First Name = $firstName") println("Age = $age") ) )
Quando você executa o programa, a saída será:
First Name = Joe Age = 25
Aqui, os parâmetros fName e personAge entre parênteses aceitam valores "Joe"
e, 25
respectivamente, quando o objeto person1 é criado. No entanto, fName e personAge são usados sem usar var
ou val
, e não são propriedades da Person
classe.
A Person
classe tem duas propriedades firstName e age são declaradas.
Quando o person1
objeto é criado, o código dentro do bloco inicializador é executado. O bloco inicializador não apenas inicializa suas propriedades, mas também as imprime.
Aqui está outra maneira de realizar a mesma tarefa:
fun main(args: Array) ( val person1 = Person("joe", 25) ) class Person(fName: String, personAge: Int) ( val firstName = fName.capitalize() var age = personAge // initializer block init ( println("First Name = $firstName") println("Age = $age") ) )
Para distinguir o parâmetro e a propriedade do construtor, nomes diferentes são usados (fName e firstName, e personAge e age). É mais comum usar _firstName e _age em vez de nomes completamente diferentes para os parâmetros do construtor. Por exemplo:
class Person (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // bloco inicializador init (…))
Valor padrão no construtor primário
Você pode fornecer o valor padrão aos parâmetros do construtor (semelhante a fornecer argumentos padrão às funções). Por exemplo:
fun main(args: Array) ( println("person1 is instantiated") val person1 = Person("joe", 25) println("person2 is instantiated") val person2 = Person("Jack") println("person3 is instantiated") val person3 = Person() ) class Person(_firstName: String = "UNKNOWN", _age: Int = 0) ( val firstName = _firstName.capitalize() var age = _age // initializer block init ( println("First Name = $firstName") println("Age = $age") ) )
Quando você executa o programa, a saída será:
Nome = Joe Idade = 25 pessoa2 é instanciada Nome = Jack Idade = 0 pessoa3 é instanciada Nome = DESCONHECIDO Idade = 0
Construtor Secundário Kotlin
No Kotlin, uma classe também pode conter um ou mais construtores secundários. Eles são criados usando constructor
palavras-chave.
Construtores secundários não são tão comuns em Kotlin. O uso mais comum de construtor secundário surge quando você precisa estender uma classe que fornece vários construtores que inicializam a classe de maneiras diferentes. Certifique-se de verificar a Herança de Kotlin antes de aprendê-la.
Veja como você pode criar um construtor secundário em Kotlin:
class Log (constructor (data: String) (// algum código) construtor (data: String, numberOfData: Int) (// algum código))
Aqui, a Log
classe tem dois construtores secundários, mas nenhum construtor primário.
Você pode estender a aula como:
classe Log (construtor (dados: String) (// código) construtor (dados: String, numberOfData: Int) (// código)) classe AuthLog: Log (construtor (dados: String): super (dados) (// código ) construtor (data: String, numberOfData: Int): super (data, numberOfData) (// código))
Aqui, os construtores da classe derivada AuthLog
chamam o construtor correspondente da classe base Log
. Para isso, super()
é usado.
No Kotlin, você também pode chamar um construtor de outro construtor da mesma classe (como em Java) usando this()
.
class AuthLog: Log (constructor (data: String): this (data, 10) (// código) construtor (data: String, numberOfData: Int): super (data, numberOfData) (// code))
Exemplo: construtor secundário Kotlin
fun main(args: Array) ( val p1 = AuthLog("Bad Password") ) open class Log ( var data: String = "" var numberOfData = 0 constructor(_data: String) ( ) constructor(_data: String, _numberOfData: Int) ( data = _data numberOfData = _numberOfData println("$data: $numberOfData times") ) ) class AuthLog: Log ( constructor(_data: String): this("From AuthLog -> " + _data, 10) ( ) constructor(_data: String, _numberOfData: Int): super(_data, _numberOfData) ( ) )
Quando você executa o programa, a saída será:
From AuthLog -> Senha inválida: 10 vezes
Nota: O construtor secundário deve inicializar a classe base ou delegar a outro construtor (como no exemplo acima) se a classe não tiver um construtor primário.