English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Modificadores de Visibilidade no Kotlin

Neste artigo, você vai entender o4espécie de modificadores de visibilidade, bem como como eles funcionam em diferentes situações.

Os modificadores de visibilidade são palavras-chave usadas para definir a visibilidade (acesso) de classes, objetos, interfaces, construtores, funções, propriedades e seus setters. (Não é possível definir modificadores de visibilidade para getters, pois eles sempre têm a mesma visibilidade que as propriedades).

NoClasse e Objetos no KotlinNo texto, você teve uma visão geral do modificador de visibilidade public e private. Neste artigo, você vai aprender detalhadamente sobre os outros dois modificadores de visibilidade protected e internal (e public e private).

modificadores de visibilidade dentro do pacote

O pacote organiza um grupo de funções, propriedades e classes, objetos e interfaces relacionados.

modificadordescrição
publicvisível em todos os lugares
privatevisível dentro do arquivo que contém a declaração
internalvisível dentro do mesmo módulo (um grupo de arquivos Kotlin compilados juntos)
protectednão pode ser usado em pacotes (usado para subclasses)

Atenção:Se não for especificado o modificador de visibilidade, o valor padrão é public.

Vamos dar um exemplo:

//Nome do arquivo: hello.kt
package test
fun função1() {}   //por padrão é público e visível em qualquer lugar
private fun função2() {}   //visível dentro de hello.kt
internal fun função3() {}   //visível no mesmo módulo
var nome = "Foo"   //em todos os lugares
    get() = campo   //visível dentro de hello.kt (igual aos seus atributos)
    private set(valor) {   //visível dentro de hello.kt
        campo = valor
    {}
private class class1 {}   //visível dentro de hello.kt

modificadores de visibilidade dentro de classes e interfaces

A seguir, como os modificadores de visibilidade funcionam para os membros declarados dentro da classe (funções, propriedades):

modificadordescrição
publicvisível para qualquer cliente que pode ver a declaração da classe
privatevisível apenas dentro da classe
protectedvisível dentro da classe e de suas subclasses
internalqualquer cliente que pode ver a declaração da classe dentro do módulo pode ver

Atenção:Se você sobrescrever um membro protegido na classe derivada sem especificar sua visibilidade, sua visibilidade também será protegida.

Vamos dar um exemplo:

open class Base() {
    var a = 1                 //por padrão é público
    private var b = 2         // classe Base privada
    protected open val c = 3  //visível para classes Base e Derived
    internal val d = 4        //visível no mesmo módulo
    protected fun e() { }     //visível para classes Base e Derived
{}
class Derived: Base() {
    // a, c, d e e() todas as propriedades da classe Base são visíveis
    // b não é visível
    override val c = 9        // c é protegido
{}
fun main(args: Array<String>) {
    val base = Base()
    //base.a e base.d são visíveis
    // base.b, base.c e base.e() não são visíveis
    val derivado = Derived()
    // derived.c invisível
{}

Alterar a visibilidade do construtor

Por padrão, a visibilidade do construtor é public. Mas você pode alterá-lo. Para isso, você precisa explicitamente adicionar a palavra-chave constructor.

No exemplo a seguir, o construtor é público por padrão:

class Test(val a: Int) {
    // code
{}

Você pode alterar sua visibilidade das seguintes maneiras.

class Test private constructor(val a: Int) {
    // code
{}

Aqui, o construtor é private.

Atenção:  Em Kotlin, as funções locais, variáveis e classes não podem ter modificadores de visibilidade.