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

Classes Aninhadas e Internas em Kotlin

Neste artigo, você aprenderá a usar classes aninhadas e classes internas com exemplos.

Classes aninhadas no Kotlin

Como no Java, o Kotlin permite que você defina uma classe dentro de outra chamada de classe aninhada

class Outer {
    ... .. ...
    class Nested {
        ... .. ...
    }
}

Como as classes aninhadas são membros externos (Outer) da classe contida, você pode usar o sinal . para acessar a classe aninhada e seus membros.

Exemplo: Exemplo de uso de classes aninhadas no Kotlin

class Outer {
    val a = "Fora da classe aninhada."
    class Nested {
        val b = "Dentro da classe aninhada."
        fun callMe() = "Chamada de função dentro da classe aninhada."
    }
}
fun main(args: Array<String>) {
    //Acessar membros da classe aninhada
    println(Outer.Nested().b)
    //Criar objeto da classe aninhada
    val nested = Outer.Nested()
    println(nested.callMe())
}

Quando o programa for executado, a saída será:

Dentro da classe aninhada.
Chamada de função dentro da classe aninhada.

Para usuários do Java

As classes aninhadas no Kotlin são semelhantes às classes estáticas aninhadas no Java.

No Java, quando você declara uma classe dentro de outra, por padrão, ela se torna uma classe interna. Mas no Kotlin, você precisa usar o modificador inner para criar uma classe interna, o que será discutido a seguir.

Classes internas no Kotlin

As classes aninhadas no Kotlin não têm permissão para acessar instâncias da classe externa. Por exemplo:

class Outer {
    val foo = "Fora da classe aninhada."
    class Nested {
        //Erro! Não é possível acessar os membros da classe externa.
        fun callMe() = foo
    }
}
fun main(args: Array<String>) {
    val outer = Outer()
    println(outer.Nested().callMe())
}

O código acima não pode ser compilado, pois tentamos acessar a propriedade foo da classe externa a partir da classe aninhada.

Para resolver este problema, você precisa usar a marcação inner para criar uma classe interna. A classe interna carrega uma referência para a classe externa e pode acessar os membros da classe externa.

Exemplo: Uso de classes internas no Kotlin

class Outer {
    val a = "Fora da classe aninhada."
    inner class Inner {
        fun callMe() = a
    }
}
fun main(args: Array<String>) {
    val outer = Outer()
    println("Uso de Objetos Externos: ${outer.Inner().callMe()}")
    val inner = Outer().Inner()
    println("Uso de Objetos Internos: ${inner.callMe()}")
}

Quando o programa for executado, a saída será:

Uso de Objetos Externos: Fora da classe aninhada.
Uso de Objetos Internos: Fora da classe aninhada.