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 objectestá ligado a uma instância da classe externa,companion objectnão. - Acesso: pode aceder-se ao
inner objectapenas através de uma instância da classe externa, aocompanion objectdiretamente pelo nome da classe. - Estado:
inner objectpode 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
}