wake-up-neo.com

Kotlin: Unterschied zwischen Objekt und Begleitobjekt in einer Klasse

Was ist der Unterschied zwischen einem Objekt und einem Begleitobjekt in einer Klasse in Kotlin?

Beispiel:

class MyClass {

    object Holder {
        //something
    }

    companion object {
        //something
    }
}

Ich habe bereits gelesen, dass ein Begleitobjekt verwendet werden soll, wenn die enthaltenen Parameter/Methoden in engem Zusammenhang mit seiner Klasse stehen.

Aber warum gibt es auch die Möglichkeit, ein normales Objekt in der Klasse zu deklarieren? Weil es sich genauso verhält wie der Begleiter, aber einen Namen haben muss.

Gibt es vielleicht einen Unterschied in seiner "statischen" (ich bin von der Seite Java)) Lebenszyklus?

58
Poweranimal

Objekte können Schnittstellen implementieren. Innerhalb einer Klasse hat das Definieren eines einfachen Objekts, das keine Schnittstellen implementiert, in den meisten Fällen keinen Vorteil. Das Definieren mehrerer Objekte, die verschiedene Schnittstellen implementieren (z. B. Comparator), kann jedoch sehr nützlich sein.

In Bezug auf den Lebenszyklus gibt es keinen Unterschied zwischen einem Companion-Objekt und einem benannten Objekt, das in einer Klasse deklariert ist.

33
yole

Es gibt zwei verschiedene Arten von object-Verwendungen: Ausdruck und Deklaration .

Objektausdruck

Ein Objektausdruck kann verwendet werden, wenn eine Klasse geringfügig geändert werden muss, es jedoch nicht erforderlich ist, eine vollständig neue Unterklasse dafür zu erstellen. Anonyme innere Klassen sind ein gutes Beispiel dafür.

    button.setOnClickListener(object: View.OnClickListener() {
        override fun onClick(view: View) {
            // click event
        }
    })

Zu beachten ist, dass anonyme innere Klassen auf Variablen aus dem einschließenden Bereich zugreifen können und diese Variablen nicht final sein müssen. Dies bedeutet, dass eine Variable, die in einer anonymen inneren Klasse verwendet wird, die nicht als final betrachtet wird, den Wert unerwartet ändern kann, bevor auf sie zugegriffen wird.

Objektdeklaration

Eine Objektdeklaration ähnelt einer Variablendeklaration und kann daher nicht auf der rechten Seite einer Zuweisungsanweisung verwendet werden. Objektdeklarationen sind sehr nützlich für die Implementierung des Singleton-Musters.

    object MySingletonObject {
        fun getInstance(): MySingletonObject {
            // return single instance of object
        }
    }

Und so kann dann die Methode getInstance aufgerufen werden.

    MySingletonObject.getInstance()

Begleitobjekt

Ein Companion-Objekt ist ein bestimmter Objektdeklarationstyp, mit dem ein Objekt ähnlich wie statische Objekte in anderen Sprachen (z. B. Java) agieren kann. Das Hinzufügen von companion zur Objektdeklaration ermöglicht das Hinzufügen der "statischen" Funktionalität zu einem Objekt, obwohl das eigentliche statische Konzept in Kotlin nicht vorhanden ist. Hier ist ein Beispiel einer Klasse mit Instanzmethoden und Begleitmethoden.

 class MyClass {
        companion object MyCompanionObject {
            fun actsAsStatic() {
                // do stuff
            }
        }

       fun instanceMethod() {
            // do stuff
        }
    }

Das Aufrufen der Instanzmethode würde folgendermaßen aussehen.

    var myClass = MyClass()
    myClass.instanceMethod()

Das Aufrufen der Companion-Objektmethode sieht folgendermaßen aus.

    MyClass.actsAsStatic()

Weitere Informationen finden Sie in den Kotlin-Dokumenten .

43
Mike

Ein Objekt oder eine Objektdeklaration wird beim ersten Zugriff träge initialisiert.

Ein Begleitobjekt wird initialisiert, wenn die entsprechende Klasse geladen wird. Es bewirkt die "statische" Essenz, obwohl Kotlin statische Elemente nicht von Natur aus unterstützt.

4
Supriya

Begleitobjekt ist vorhanden, weil Sie die Funktionen/Eigenschaften von Begleitobjekten aufrufen können, als wäre es eine statische Methode/ein statisches Feld Java. Und für den Grund, warum Ihr Holder zulässig ist, gibt es keinen Grund, ein verschachteltes Objekt für illegal zu erklären. Es kann manchmal nützlich sein.

3
glee8e

Ein Companion-Objekt wird initialisiert, wenn die Klasse geladen wird (normalerweise wird sie zum ersten Mal von einem anderen ausgeführten Code referenziert), wohingegen Objekt Deklarationen träge initialisiert werden. beim ersten Zugriff.

Bitte beachten Sie https://kotlinlang.org/docs/reference/object-declarations.html Der untere Abschnitt definiert klar den Unterschied zwischen diesen beiden.

0
Swati Singh