Sobes.tech
Middle

Qual é a diferença entre um objeto dentro de uma classe e um companheiro de objeto em Kotlin?

sobes.tech IA

Resposta da IA

Um objeto interno (inner object) dentro de uma classe está ligado a uma instância da classe externa e existe apenas durante o seu ciclo de vida. O objeto companheiro (companion object) existe como um singleton, não ligado a uma instância da classe, e pode ser acessado diretamente pelo nome da classe.

Principais diferenças:

  • Ligação à instância: inner object está ligado a uma instância da classe externa, companion object não.
  • Acesso: pode aceder-se ao inner object apenas através de uma instância da classe externa, ao companion object diretamente pelo nome da classe.
  • Estado: inner object pode ter um estado específico da instância, companion object é comum a toda a classe.
  • Utilização: inner object é frequentemente usado para implementar padrões como State ou para agrupar objetos relacionados dentro de uma instância. companion object é usado para métodos de fábrica, constantes ou membros estáticos da classe.

Exemplo:

class Outer {
    private var outerValue: Int = 0

    inner object InnerObject {
        fun accessOuterValue(): Int {
            return outerValue // inner object tem acesso aos membros da classe externa
        }
    }

    companion object CompanionObject {
        const val CONSTANT = "Some constant"

        fun createOuter(): Outer {
            return Outer() // método de fábrica
        }
    }
}

fun main() {
    val outer = Outer.CompanionObject.createOuter() // acesso ao companion object
    // val inner = Outer.InnerObject // Erro: não é possível aceder ao InnerObject sem uma instância de Outer
    val inner = outer.InnerObject // acesso ao inner object através da instância

    println(inner.accessOuterValue())
    println(Outer.CompanionObject.CONSTANT)
    println(Outer.CONSTANT) // açúcar sintático para acesso aos membros do CompanionObject
}