Construtores Kotlin
1. Visão geral
Neste tutorial, daremos uma olhada completa nos construtores em Kotlin.
Vamos começar com uma rápida recapitulação do conceito: usamos construtores para criar objetos. Parecem declarações de método, mas sempre têm o mesmo nome da classe e não retornam nada.
Para a configuração de um projeto Kotlin, dê uma olhada em nossointroductory tutorial.
No Kotlin, uma classe pode ter um construtor primário e um ou mais construtores secundários adicionais.
Nas próximas seções, examinaremos cada tipo e conceitos associados.
2. Construtor Primário
A primeira maneira de criar um objeto no Kotlin é usando um construtor primário.
This is a part of the class header. Parâmetros também podem ser campos de classe, que colocamos após a declaração da classe.
Vamos dar uma olhada em uma declaração de classe básica, com duas propriedades e um construtor primário:
class Person constructor(val name: String, val age: Int? = null)
Neste exemplo, declaramos propriedades por meio da palavra-chaveval . Isso se comporta da mesma maneira que as variáveis regulares, com a menção de que as propriedadesval são somente leitura (Javafinal contrapartida da palavra-chave).
Se quisermos alterar a referência posteriormente, devemos usar a palavra-chavevar . No entanto, não podemos omitir o tipo de campo no construtor primário, pois isso deve ser explícito.
In some cases, we can omit the constructor keyword. Isso só é obrigatório em dois casos: quando usamos anotações, como@Autowired ou modificadores de acesso, comoprivate ouprotected.
Além disso, podemos usar parâmetros padrão do Kotlin nos construtores.
A seguir, vamos ver como podemos usar nosso construtor principal:
val person = Person("John")
val personWithAge = Person("Mark", 22)
Podemos ver quea class name is a constructor invocation. There’s no need to use the new keyword.
Para referência, vamos dar uma olhada no equivalente Java de uma declaração de construtor:
class PersonJava {
final String name;
final Integer age;
public PersonJava(String name) {
this.name = name;
this.age = null;
}
public PersonJava(String name, Integer age) {
this.name = name;
this.age = age;
}
}
Como você pode ver, o Java precisaria de muito mais código para obter o mesmo resultado.
2.1. Construtores principais na JVM
Observe que o compilador irá gerar um construtor adicional sem parâmetros na JVM. Para este propósito, ele irá instanciar um objeto com valores padrão.
Dessa forma, o Kotlin pode funcionar bem com bibliotecas como Jackson ou JPA, que usam o construtor no-args para criar instâncias de classe:
class Person(val name: String = "")
3. Inicializando propriedades a partir de parâmetros do construtor
Os inicializadores de propriedade do corpo da classe podem usar os parâmetros do construtor primário.
Vamos transformarname para a propriedadeupperCaseName:
class Person(val name: String, val age: Int? = null) {
val upperCaseName: String = name.toUpperCase()
}
Podemos ver a saída no console adicionando o segundo blocoinit:
init {
println("Upper case name is $upperCaseName")
}
4. Blocos do inicializador
Não podemos colocar nenhum código no construtor primário.
No entanto, às vezes temos que executar algum código de inicialização. Um bom lugar para isso é um bloco inicializador, que é prefixado com a palavra-chaveinit.
The initializer block is called after the primary constructor. Também podemos acessar os campos de classe neste local.
Uma classe pode ter um ou mais blocosinit.
Vamos anexar o bloco inicializador à nossa classePerson:
init {
println("Hello, I'm $name")
if (surname.isEmpty()) {
throw IllegalArgumentException("Surname cannot be empty!")
}
}
A seguir, quando criarmos um objeto de classePerson, veremos no console:
Hello, I'm John
JogaríamosIllegalArgumentException para osurname. vazio
Quando temos muitos blocosinit , eles serão executados na mesma ordem em que aparecem no corpo da classe.
5. Construtor Secundário
Em uma classe Kotlin, também podemos declarar um ou mais construtores secundários.Secondary constructors are prefixed with the constructor keyword:
class Car {
val id: String
val type: String
constructor(id: String, type: String) {
this.id = id
this.type = type
}
}
E o uso básico:
fun main(args: Array) {
val car = Car("1", "sport")
val suvCar = Car("2", "suvCar")
}
Each secondary constructor has to delegate to the primary constructor. Faremos isso porthis palavra-chave.
Vamos mover nossas propriedades paraprimary constructore modificarsecondary constructor:
class Car(val id: String, val type: String) {
constructor(id: String): this(id, "unknown")
}
6. Construtores e Herança
Podemos usar um construtor primário da superclasse.
Observe que todas as classes em Kotlin sãofinal por padrão. Isso significa que precisaremos adicionar a palavra-chaveopen para que possamos herdar de nossa classePerson.
Vamos adicionar uma classeEmployee que herda da classePerson . Ambos estão usando construtores principais:
class Employee(name: String, val salary: Int): Person(name)
Fazendo isso, passamosname para o construtor primário dePerson class. Além disso, adicionamos um novo campo chamadosalary na classeEmployee.
7. Conclusão
Neste rápido artigo, discutimos várias maneiras de criar construtores na linguagem Kotlin. Podemos instanciar nossos campos de muitas maneiras diferentes, de acordo com nossos desejos.
A implementação de todos os nossos exemplos pode ser encontrada emthe Github project.
Para obter mais informações sobre os próprios recursos do Kotlin, dê uma olhada em nossointroduction to Kotlin.