Lesezeit: 4 Minuten
Um die Verwendung von Begleitobjekten zu verstehen, ist es wichtig, zuerst die statischen Elemente zu verstehen. Wir haben gelernt, dass Klassen in objektorientierten Sprachen die Blaupause sind, die Elemente wie Felder und Methoden enthält. Um jedoch auf diese Felder oder Methoden zugreifen zu können, müssen wir zuerst die Objekte aus diesen Klassen erstellen.
Schauen wir uns ein Beispiel an.
class Math { private val max = 100 def sum(a: Int, b: Int): Int = a + b}object Test { def main(args: Array): Unit = { val math = new Math() math.sum(5, 10) }}
Wir haben eine Klasse namens Math mit einer Methode namens sum erstellt, die zwei Zahlen aufnimmt und die Summe als Ergebnis zurückgibt.
Um diesen Code auszuführen, erstellen wir eine Instanz dieser Mathematikklasse und rufen die sum-Methode unter Umgehung von 5 und 10 auf, wobei wir 15 als Ausgabe erhalten. Wie wir jedoch sehen, ist die sum-Methode von keiner der Mitgliedsvariablen der Math-Klasse abhängig.
Zum Beispiel die Max-Mitgliedsvariable in diesem Fall. Daher sollte es nicht erforderlich sein, eine Instanz der Math-Klasse zu erstellen, um die sum-Methode aufzurufen. Wir sollten dies in diesem Fall direkt aufrufen können. Und hier kommen die Begleitobjekte ins Bild.
Es gibt vier Dinge, an die wir uns bei Begleitobjekten erinnern müssen:
1. Sie haben denselben Namen wie die entsprechende Klasse.
2. Sie beginnen mit dem Schlüsselwort „Objekt“.
3. Sie befinden sich in derselben Quelldatei wie die entsprechenden Klassen.
4. Die Begleitobjekte und die entsprechenden Klassen fungieren als private Mitglieder des jeweils anderen.
Das Schlüsselwort „object“ gibt an, dass es sich um ein Singleton-Objekt handelt. Mit anderen Worten, es bedeutet, dass Sie während der Ausführung Ihres Programms so viele Instanzen aus Ihren Klassen erstellen können, wie Sie möchten, aber das Singleton-Objekt wäre nur eine, und es wird nicht mehrere Instanzen davon geben.
Lassen Sie uns sie anhand unseres mathematischen Beispiels in Aktion sehen.
object Math { def sum(a: Int, b: Int): Int = a + b def getPrivateMember: Int = = new Math().max}class Math { private val max = 100}object Test { def main(args: Array): Unit = { Math.sum(5, 10) Math.getPrivateMember }}
Wie wir sehen, haben wir ein neues Singleton-Objekt namens Math erstellt, das denselben Namen wie unsere Klasse Math hat. Es beginnt auch mit dem Schlüsselwort „object“ und verbleibt in derselben Datei wie die Klasse Math.
Wir haben die Implementierung für die Summe von der Klasse auf das Begleitobjekt verschoben. Da wir wissen, dass die sum Implementierung nicht von den Mitgliedsvariablen für die Math Klasse abhängt, hilft das Einfügen dieser Implementierung in das Begleitobjekt den Aufrufern, die Instanz der Math Klasse nicht zu erstellen und direkt aufzurufen.
Es gibt eine andere Methode, die wir geschrieben haben, um zu zeigen, dass das Begleitobjekt Zugriff auf die privaten Mitglieder seiner Klasse hat.
Hier instanziiert das getPrivateMember die Math-Klasse und gibt ihr ein privates Mitglied mit dem Namen „max“ zurück. Es gibt eine zusätzliche Sache zu beachten. Wenn wir das getPrivateMember definieren, haben wir die Klammern nicht gesetzt. In Scala gibt es eine Konvention, in der wir die Klammern weglassen können, wenn die Methode keine Argumente hat und keine Nebenwirkung hat, was bedeutet, dass es sich um eine reine Funktion handelt.
Hier gibt getPrivateMember nur den Wert der Membervariablen zurück, daher lassen wir die Klammern weg.
Math.sum(5, 10)Math.getPrivateMember
Wenn wir die sum-Methode ausführen, haben wir sie aus dem Math Companion-Objekt ausgeführt und mussten die neue Instanz der Math-Klasse nicht erstellen. Zusätzlich konnten wir über das Begleitobjekt auf die private Mitgliedsvariable der Math-Klasse zugreifen.
Erstellen von Objekten mit Apply
Wir wissen, dass wir zum Erstellen einer neuen Instanz eines Objekts das Schlüsselwort „new“ verwenden müssen.
Zum Beispiel:
class Person(firstName: String, lastName: String) {def getName: String = firstName + lastName}object Test { def main(args: Array): Unit = { val alice = new Person("Alice", "Christy") }}
Wir haben eine Klasse namens „Person“ mit dem Vor- und Nachnamen als Klassenparameter. Und wir erstellen eine neue Instanz von Person wie oben gezeigt. Wir haben „alice“ als neue Person erstellt und den Vor- und Nachnamen übergeben.
In Scala gibt es jedoch eine weitere Möglichkeit, Objekte zu erstellen, ohne das Schlüsselwort new zu verwenden.
In diesem Objekt gibt es eine Methode namens „apply“, die speziell vom Scala-Compiler behandelt wird und es uns ermöglicht, neue Instanzen von Klassen zu erstellen, ohne das neue Schlüsselwort zu benötigen. Lassen Sie uns lernen, wie man es in unserem Code verwendet.
object Person { def apply(firstName: String, lastName: String): Person = new Person(firstName, lastName)}class Person(firstName: String, lastName: String) { def getName: String = firstName + " " + lastName}object Test { def main(args: Array): Unit = { val alice = Person("Alice", "Christy") println(p.getName) }}
Wie wir hier sehen, haben wir ein Begleitobjekt mit der apply-Methode erstellt. Es benötigt die Argumente, die wir zum Erstellen einer Instanz der Klasse Person benötigen, erstellt die Instanz von Person intern und gibt die Instanz zurück. Wie wir sehen, haben wir die Instanz der Person-Klasse erstellt, ohne das Schlüsselwort new zu verwenden. Und wir können wie jedes andere Objekt auf die Mitglieder zugreifen. 🙂
Das ist alles über das Objekt aus diesem Blog. Lernen Sie weiter, wachsen Sie weiter!!!