Interoperabilidade Kotlin Java

Interoperabilidade Kotlin Java

1. Visão geral

Neste tutorial, vamos discutir ointeroperability between Java and Kotlin.. Vamos cobrir alguns exemplos básicos, bem como alguns outros cenários mais complexos.

2. Configurando Kotlin

Criar um projeto Kotlin é muito simples usando IntelliJ, Eclipse e até mesmo a linha de comando - no entanto, para este tutorial, seguiremos as etapas de instalação de nosso tutorial anteriorIntroduction to Kotlin, pois já tem o que precisamos para nossa demonstração finalidades.

3. O básico

Calling Java from Kotlin is straightforward and smooth since it was built with the idea of interoperability.

Vamos criar esta classeCustomer usando o núcleo do Java:

public class Customer {

    private String firstName;
    private String lastName;
    private int age;

    // standard setters and getters

}

4. Getters e Setters

Agora vamos trabalhar com este POJO Java simples de Kotlin.

Os getters e setters que seguem a convenção Java para esses tipos de métodos são representados como atributos no Kotlin:

val customer = Customer()

customer.firstName = "Frodo"
customer.lastName = "Baggins"

assertEquals(customer.firstName, "Frodo")
assertEquals(customer.lastName, "Baggins")

É importante notar quethe new keyword is not required para instanciar um objeto.

A linguagem tenta evitar o máximo possível o código padrão, para não chamar explicitamente getters / setters - podemos simplesmente usá-los usando a notação de campo.

Precisamos lembrar que se uma classe Java tiver apenas métodos setter, a propriedade não estará acessível, pois a linguagem não suporta propriedades somente set.

Se um método retornarvoid, quando for chamado do Kotlin, ele retornaráUnit.

5. Segurança nula

O Kotlin é bem conhecido por seu recurso de segurança nula, mas, como sabemos, esse não é o caso do Java, o que o torna impraticável para objetos provenientes dele. Um exemplo muito simples pode ser visto se tivermos uma matrizString:

val characterList = ArrayList()
characterList.add("Bilbo")
val character = list[0]

O Kotlin não exibe nenhum erro de nulidade no momento da compilação quando um método está sendo chamado em uma variável de um tipo de plataforma - e esse tipo não pode ser escrito explicitamente na linguagem. Portanto, quando um valor é atribuído, podemos confiar nessa inferência ou apenas escolher o tipo que esperamos:

val a: String? = character
val a: String = character

Ambos são permitidos, mas no caso do tipo não nulo, o compilador irá declarar imediatamente após a atribuição, o que impedirá a variável de manter um valor nulo.

No final, o compilador faz o possível para evitar nulos, mas ainda assim, é impossível eliminá-lo por causa dos genéricos.

6. Matrizes

Em Kotlin, os arrays são invariáveis ​​- o que significa que não nos permitiria atribuirArray<Int> aArray<Any> para evitar falhas de tempo de execução.

Portanto, temos uma classe de exemplo:

public class ArrayExample {

    public int sumValues(int[] nums) {
        int res = 0;

        for (int x:nums) {
            res += x;
        }

        return res;
    }
}

If we want to pass an array of primitives to this method, we have to use one of the specialized classes de Kotlin:

val ex = ArrayExample()
val numArray = intArrayOf(1, 2, 3)

assertEquals(ex.sumValues(numArray), 6)

7. Varargs

Java nos dá a capacidade de passar qualquer número de argumentos para um método:

public int sumArgValues(int... sums) {
    // same as above
}

O processo é o mesmo, com a ligeira diferença de que precisamos usar o operador spread* para passar a matriz:

assertEquals(ex.sumValues(*numArray), 6)

Atualmente, não há possibilidade de passarnull para um método varargs.

8. Exceções

In Kotlin all exceptions are unchecked, o que significa que o compilador não nos forçará a capturar nenhuma exceção:

// In our Java code

public void writeList() throws IOException {
    File file = new File("E://file.txt");
    FileReader fr = new FileReader(file);
    fr.close();
}

// In Kotlin

fun makeReadFile() {
    val ax = ArrayExample()
    ax.writeList()
}

9. Reflexão

Simplificando, a reflexão funciona nas classes Kotlin e Java:

val instance = Customer::class.java
val constructors = instance.constructors

assertEquals(constructors.size, 1)
assertEquals(constructors[0].name, "com.example.java.Customer")

Também podemos obter métodos getter e setter, umKProperty para um campo Java e umKFunction para um construtor.

10. Métodos de objeto

Quando os objetos são importados para Kotlin, todas as referências do tipojava.lang.Object são alteradas parakotlin.Any:

val instance = Customer::class
val supertypes = instance.supertypes

assertEquals(supertypes[0].toString(), "kotlin.Any")

11. Conclusão

Este tutorial rápido nos fornece uma compreensão maior deKotlin Java Interoperability. Examinamos alguns exemplos simples para mostrar como o Kotlin geralmente leva a um código menos detalhado no geral.

Como sempre, a implementação de todos esses exemplos e snippets pode ser encontradaover on GitHub. Este é um projeto baseado em Maven, portanto deve ser fácil importar e executar.