Modificadores de visibilidade em Kotlin

Modificadores de visibilidade em Kotlin

1. Introdução

A linguagem de programação Kotlin é construída sobre a Java Virtual Machine (JVM). Como tal, ele deve seguir todas as regras que a JVM impõe - incluindo modificadores de visibilidade.

No entanto, existem algumas nuances sutis na maneira como a linguagem implementa esses modificadores no que diz respeito ao compilador e à maneira como nosso código é estruturado. Este artigo mostrará algumas das semelhanças e diferenças entre Java e Kotlin a esse respeito.

2. Modificadores de Visibilidade

Modificadores de visibilidade são usados ​​para determinar quais outros elementos do código têm acesso ao elemento que está sendo modificado. Eles se aplicam a alguns elementos diferentes no código, em vários níveis de escopo. A maneira como essas regras são aplicadas pode variar um pouco entre esses diferentes usos, o que pode ser confuso no início.

2.1. Visibilidade Pública

O modificador mais óbvio épublic. Essa é possivelmente a mais utilizada em todo o idioma e significa que não há restrições adicionais sobre quem pode ver o elemento sendo modificado.

Unlike Java, in Kotlin there is almost never any need to declare anything as public - é o modificador padrão usado se não declararmos outro. Fora isso, ele funciona da mesma forma no Kotlin e em Java.

Se aplicarmos o modificadorpublic a um elemento de nível superior - uma classe externa ou uma função ou variável declarada diretamente dentro de um pacote - então qualquer outro código pode acessá-lo. Se aplicarmos o modificadorpublic a um elemento aninhado - uma classe interna, ou uma função ou variável dentro de uma classe - então qualquer código que pode acessar o contêiner também pode acessar esse elemento.

Por exemplo:

class Public {
    val i = 1

    fun doSomething() {
    }
}

A classePublic pode ser acessada de qualquer lugar em toda a base de código,“val i ”e“ fundoSomething()” são acessíveis de qualquer coisa que possa acessarPublic.

2.2. Visibilidade Privada

O outro modificador que é usado na maioria das vezes éprivate. Isso tem quase o significado oposto depublic - significa que ninguém pode acessá-lo.

Na realidade,in Kotlin it means that only code declared inside the same scope can access it. Isso é sutilmente diferente do Java simplesmente porque Kotlin permite várias declarações de nível superior no mesmo arquivo - um elemento de nível superiorprivate pode ser acessado por todos os outros no mesmo arquivo. Fora isso, as regras são as mesmas. Por exemplo:

Por exemplo:

private class Private {
    private val i = 1

    private val doSomething() {
    }
}

A classePrivate só pode ser acessada de dentro do mesmo arquivo de origem,“val i ”e“ fundoSomething()” são acessíveis apenas de dentro da classePrivate.

2.3. Visibilidade protegida

The protected modifier in Kotlin means that it is strictly accessible only by the declaring class and subclasses. É o mesmo que a maioria das pessoas espera que o Java funcione, mas sutilmente diferente de como o Java funciona.

Em Java, o modificadorprotected também permite acesso ao elemento de qualquer outro no mesmo pacote. Por exemplo, dado o seguinte arquivo de classe:

class A {
    protected val i = 1
}

O seguinte arquivo funcionaria bem no Kotlin:

class B : A() {
    fun getValue() : Int {
        return i
    }
}

O seguinte arquivo funcionaria em Java, mas não no Kotlin:

class C {
    fun getValue() : Int {
        val a = A()
        return a.i
    }
}

E o seguinte não funcionaria no Java nem no Kotlin:

class D {
    fun getValue() : Int {
        val a = A()
        return a.i
    }
}

Além disso,in Kotlin protected becomes the default visibility when we are overriding a protected element from a superclass. Isso pode ser explicitamente alterado parapublic se desejado e é o principal momento em que precisaremos declarar algo como público explicitamente____.

2.4. Visibilidade privada / padrão do pacote

Em Java, há um modificador de acesso conhecido como "pacote privado" (também conhecido como "padrão"). Isso é usado quando nenhum modificador é colocado no elemento. Isso significa que qualquer código no mesmo pacote pode acessá-lo, mas qualquer código em um pacote diferente não pode, incluindo subclasses.

Kotlin does not currently have any support for this modifier at all, embora isso possa mudar no futuro. O motivo para isso é que ele não oferece proteção - qualquer um pode definir código no mesmo pacote e acessar nossos elementos, mesmo a partir de um arquivo jar diferente.

2.5. Visibilidade Interna

Kotlin adiciona um novo modificador às opções que o Java não suporta atualmente -internal. This modifier means that any code declared in the same module that is not otherwise restricted can access this element. (Um módulo é essencialmente um arquivo Jar.)

Isso é possível em Java usando coisas comoOSGi, mas não é nativo da linguagem no momento. O Java 9 trará alguns conceitos que o tornam mais viável ao poder exportar identificadores públicos seletivamente.

Isso adiciona um enorme benefício para a criação de APIs e implementações. Podemos escrever nossas interfaces de API comopublic, nossa implementação principal como classespublic e todo o código de suporte do qual depende comointernal. Fazer isso significa que o código externo é forçado a passar pela API e não pode obter acesso aos internos. Por exemplo:

package com.example.modifiers

internal class Internal {
}

class Public {
    internal val i = 1

    internal fun doSomething() {
    }
}

A classeInternal só pode ser acessada de dentro do mesmo módulo. “val i”e“fun doSomething()” também só podem ser acessados ​​de dentro do mesmo módulo, embora a classe em que eles estão possa ser acessada de qualquer lugar.

3. Sumário

No artigo, vimos os modificadores de visibilidade no Kotlin.

Na maioria das vezes, as regras do modificador de visibilidade no Kotlin funcionam da mesma forma que esperamos do Java. No entanto, há uma grande diferença - que é a introdução do escopointernal - que é muito útil para projetos maiores.