Frage

Gibt es einen Fall, in dem ein Begleitobjekt (Singleton) für eine Klasse benötigt? Warum sollte ich eine Klasse erstellen möchten, sagen Foo und auch ein Begleitobjekt für sie erstellen?

War es hilfreich?

Lösung

Das Begleiter-Objekt stellt grundsätzlich einen Ort, wo man „statisch-like“ Methoden setzen kann. Darüber hinaus hat ein Begleitobjekt oder Begleiter Modul, vollen Zugang zu den Teilnehmern auch privat.

Companion-Objekte sind für Dinge wie Factory-Methoden kapseln. Statt zu haben, zum Beispiel, Foo und FooFactory überall, können Sie eine Klasse mit einem Begleiter bezweckt auf dem Werk Verantwortung übernehmen.

Andere Tipps

Companion-Objekte sind nützlich für Zustand und Methoden zu speichern, die für alle Instanzen einer Klasse gemeinsam sind aber nicht statisch verwenden Methoden oder Felder. Sie nutzen regelmäßig virtuelle Methoden, die durch Vererbung außer Kraft gesetzt werden kann. Scala hat wirklich nichts statisch. Es gibt viele Möglichkeiten, wie Sie diese verwenden können, aber hier ist ein einfaches Beispiel.

abstract class AnimalCounter
{
    var animals = 0

    def name: String

    def count()
    {
        animals += 1
        println("%d %ss created so far".format(animals, name))
    }
}

abstract class Animal
{
    def companion: AnimalCounter
    companion.count()
}

object Dog extends AnimalCounter
{
    val name = "dog"
}

class Dog extends Animal
{
    def companion = Dog
}

object Cat extends AnimalCounter
{
    val name = "cat"
}

class Cat extends Animal
{
    def companion = Cat
}

Welche erzeugt diese Ausgabe:

scala> new Dog
1 dogs created so far

scala> new Cat
1 cats created so far

scala> new Dog
2 dogs created so far

scala> new Cat
2 cats created so far

... und es ist ein guter Ort, statische Factory-Methoden zu speichern (nicht, dass DP) für begleitet Klassen. Wenn Sie diese überladene Fabrikmethoden nennen gelten (/ ... /) können Sie Sie Klasse erstellen / initialisieren

  1. ohne 'neuen' (nicht wirklich so wichtig)

  2. mit verschiedenen möglichen Parametersätzen (vergleiche, was Bloch in Effective Java schreibt über teleskopierbare Konstruktor)

  3. mit der Fähigkeit, zu entscheiden, welche Klasse abgeleitet Sie anstelle der abstrakten (begleitet) ein

  4. erstellen möchten

Beispielcode:

abstract class AbstractClass;
class RealThing(s: String) extends AbstractClass;
class AlternativeThing(i: Int) extends AbstractClass;
object AbstractClass {
  def apply(s: String) = {
    new RealThing(s)
  }
  def apply(i: Int) = {
    new AlternativeThing(i)
  }
}

// somewhere else you can
val vs = AbstractClass("asdf")  // gives you the RealThing wrapped over string
val vi = AbstractClass(123)  // gives you AlternativeThing wrapped over int

Ich würde das Objekt / Basisklasse AbstractXxxxx nicht nennen, weil es nicht schlecht aussieht: wie etwas abstrakt. Geben Sie diese Namen eine wirkliche Bedeutung. Erwägen Sie die Verwendung unveränderlich, Methode weniger, Fallklassen und versiegeln Sie die abstrakte Basisklasse.

Zusätzlich zu den Dingen Saem sagte in seine Antwort , der Scala-Compiler sucht auch nach impliziten Konvertierungen von Arten in den entsprechenden Begleiter Objekte (von der Quelle oder Ziel), so dass die Umwandlungen müssen nicht importiert werden.

über den Grund für Singleton Objekte im allgemeinen Programmierung in Scala rel="nofollow sagt:

  

Wie in Kapitel 1 erwähnt, ist eine Art und Weise, in der Scala ist objektorientiert als Java ist, dass Klassen in Scala nicht statisch Mitglieder haben. Stattdessen hat Scala Singleton-Objekte (Seite 65).

Ich sehe immer Begleiter Objekte als Brücke zu schreiben, sowohl funktional als auch objektorientierten Code in Scala. Oft brauchen wir nur reine Funktionen, die eine Eingabe nehmen und ein Verarbeitungsergebnis liefern. die einschlägigen Funktionen im Begleitobjekt Putting macht es einfach für mich suchen und nutzen, sowie einige ein Gebäude auf meinem Code.

Darüber hinaus ist es ein Sprache zur Verfügung gestellt Merkmal des Singletonmuster zu schreiben, ohne etwas zu tun. Dies ist besonders nützlich, wenn Sie einen Singleton benötigen einen delegator für das Leben des JVM zu verkapseln. Um zum Beispiel eine einfache HTTP-Client-Bibliothek in Scala zu schreiben, wo Sie eine zugrunde liegende Java-Implementierung auf Basis delegator kapseln und lassen die Verbraucher Ihrer API in reinen Welt leben.

Wenn Sie Klasse und Objekt in derselben Datei mit demselben Namen definieren, sie als Begleiter Klasse und Objekt bekannt. Scala nicht statisch hat als JAVA Schlüsselwort, Sie als Ersatz von statischen mit Begleiter Klasse und Objekt in Scala nehmen.

Für weitere Detailinformationen bitte Artikel überprüfen Klassen- und Objekt Stichwort in scala Programmierung

Zunächst bietet es eine klare Trennung von statischen vs nicht statischen Methoden eine einfache Art und Weise methods.Also bietet Singletonklasse zu erstellen.

Es kann auch Methoden von anderen Klassen erbt und / oder Eigenschaften, die nicht mit Java statisch methods.and getan werden kann als Parameter übergeben werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top