Sobes.tech
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
}