Construtores e inicializadores Kotlin (com exemplos)

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 Personclasse é criada, "Joe"e 25os valores são transmitidos como se Personrepresenta uma função.

Isso inicializa firstNamee agepropriedades do objeto person1 para "Joe"e 25respectivamente.

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 initpalavra - 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, 25respectivamente, quando o objeto person1 é criado. No entanto, fName e personAge são usados ​​sem usar varou val, e não são propriedades da Personclasse.

A Personclasse tem duas propriedades firstName e age são declaradas.

Quando o person1objeto é 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 constructorpalavras-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 Logclasse 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 AuthLogchamam 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.

Artigos interessantes...