Middle
Ποια είναι η διαφορά μεταξύ ενός αντικειμένου μέσα σε μια κλάση και ενός συνοδευτικού αντικειμένου στο Kotlin;
sobes.tech AI
Απάντηση από AI
Ένα εσωτερικό αντικείμενο (inner object) μέσα σε μια κλάση συνδέεται με ένα στιγμιότυπο της εξωτερικής κλάσης και υπάρχει μόνο κατά τη διάρκεια του κύκλου ζωής του. Το companion object υπάρχει ως singleton, δεν συνδέεται με ένα στιγμιότυπο της κλάσης και μπορεί να προσπελαστεί απευθείας μέσω του ονόματος της κλάσης.
Βασικές διαφορές:
- Σύνδεση με το στιγμιότυπο: Το
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 // πρόσβαση στο inner object μέσω του στιγμιότυπου
println(inner.accessOuterValue())
println(Outer.CompanionObject.CONSTANT)
println(Outer.CONSTANT) // συντακτική ζάχαρη για πρόσβαση στα μέλη του CompanionObject
}