Middle
Каква е разликата между обект вътре в клас и съпътстващ обект в Kotlin?
sobes.tech AI
Отговор от AI
Обект вътре в клас (inner object) е свързан с екземпляр на външния клас и съществува само по време на неговия жизнен цикъл. Обектът-компаньон (companion object) съществува като сингълтон, не е свързан с екземпляр на класа и може да бъде достъпен директно чрез името на класа.
Основни разлики:
- Свързване с екземпляр:
inner objectе свързан с екземпляр на външния клас,companion objectне. - Достъп: до
inner objectможе да се достъпи само чрез екземпляр на външния клас, доcompanion object- директно чрез името на класа. - Състояние:
inner objectможе да има състояние, специфично за екземпляра,companion object- общо за целия клас. - Използване:
inner objectчесто се използва за реализиране на шаблона State или за групиране на свързани обекти вътре в екземпляр.companion objectсе използва за фабрични методи, константи или статични членове на класа.
Пример:
class Outer {
private var outerValue: Int = 0
inner object InnerObject {
fun accessOuterValue(): Int {
return outerValue // inner object има достъп до членовете на външния клас
}
}
companion object CompanionObject {
const val CONSTANT = "Some constant"
fun createOuter(): Outer {
return Outer() // фабричен метод
}
}
}
fun main() {
val outer = Outer.CompanionObject.createOuter() // достъп до companion object
// val inner = Outer.InnerObject // Грешка: не може да се достъпи InnerObject без екземпляр на Outer
val inner = outer.InnerObject // достъп до вътрешния обект чрез екземпляр
println(inner.accessOuterValue())
println(Outer.CompanionObject.CONSTANT)
println(Outer.CONSTANT) // синтактичен захар за достъп до членове на CompanionObject
}