[JAVA] Ich habe Scala ~ [Objekt] ~ berührt

Introduction

image.png

Es ist eine direkte Migration des Dwango-Tutorials, in dem Sie es studieren, bearbeiten und durch Ihre eigenen Begriffe ersetzen.

Objekt

In Scala sind alle Werte Objekte. Außerdem gehören alle Methoden zu einem Objekt. Daher ist es nicht möglich, statische Felder und statische Methoden zu erstellen, die zu einer Klasse gehören, wie dies bei Java der Fall ist. Stattdessen können Sie mit dem Objektschlüsselwort ein Singleton-Objekt mit demselben Namen unter dem aktuellen Namespace definieren. Für ein durch das Objektschlüsselwort definiertes Singleton-Objekt können eigene Methoden und Felder definiert werden.

Die Hauptverwendung der Objektsyntax ist

Speicherort von Dienstprogrammmethoden und globalen Status (statische Methoden und Felder in Java) Factory-Methode für Objekte derselben Namensklasse Kann erwähnt werden.

Die grundlegende Syntax des Objekts entspricht fast der der Klasse.

object <Objektname> extends <Name der Klasse> (with <Trate Name>)* {
  (<Felddefinition> | <Methodendefinition>)*
}

Es wird sein. In Scala wird standardmäßig ein Objekt namens Predef definiert und importiert. Dies gilt für die erste Verwendung. Die Methode, die ich gelegentlich mit println ("Hallo") verwendet habe, ist eigentlich eine Predef-Methode. Der Grund, warum Sie die Klasse mit extensiv erben und das Merkmal mit mit mischen können, besteht darin, dass Sie möglicherweise möchten, dass sich der Objektname als Unterklasse einer vorhandenen Klasse verhält. In Scalas Standardbibliothek gibt es ein Objekt namens Nil, das von List erbt, weil wir möchten, dass es sich als Listentyp verhält. Auf der anderen Seite mischen Objekte selten Merkmale ein, was anscheinend auf die syntaktische Kompatibilität mit Klassen und Merkmalen zurückzuführen ist.

Lassen Sie uns auf der anderen Seite über die zweite Verwendung nachdenken. Wenn Sie versuchen, eine Factory der Point-Klasse zu erstellen, die einen Punkt mit Objekt darstellt, sieht dies folgendermaßen aus: Die Methode apply wird vom Scala-Prozessor speziell behandelt. Wenn eine Beschreibung wie Point (x) vorhanden ist und eine Methode namens apply im Point-Objekt Point.apply (x) definiert ist. Wird interpretiert als. Wenn Sie dies verwenden, um ein Objekt mit der Apply-Methode des Punktobjekts zu erstellen, können Sie ein Objekt mit einer Beschreibung wie Punkt (3, 5) erstellen.


scala> class Point(val x:Int, val y:Int)
defined class Point

scala> object Point {
     |   def apply(x: Int, y: Int): Point = new Point(x, y)
     | }
defined object Point
warning: previously defined class Point is not a companion to object Point.
Companions must be defined together; you may wish to use :paste mode for this.

Dies wird mit dem Erstellen eines Point-Objekts direkt mit new Point () verglichen.

Die Implementierungsdetails der Klasse (Point) können innen ausgeblendet werden (nur die Schnittstelle ist nach außen sichtbar). Kann eine Instanz dieser Unterklasse anstelle von Point zurückgeben Es gibt Verdienste wie. Beachten Sie, dass die obige Beschreibung mit der Fallklasse einfacher ist.


scala> case class Point(x: Int, y: Int)
defined class Point

Kann geschrieben werden. Fallklassen werden auch im Abschnitt "Musterübereinstimmung" unten angezeigt, aber ich werde hier nicht darauf eingehen, wie sie verwendet werden. Einfach ausgedrückt macht die case-Klasse alle Felder des primären Konstruktors der Klasse verfügbar, an die sie angehängt ist, und erstellt eine Klasse, die die grundlegenden Methoden des Objekts wie equals (), hashCode (), toString () usw. überschreibt. Außerdem wird eine Factory-Methode erstellt, um eine Instanz dieser Klasse zu erstellen. Beispielsweise definiert die in der Fallklasse Point (x: Int, y: Int) definierte Point-Klasse die equals () -Methode nicht explizit.


Point(1, 2).equals(Point(1, 2))

Der ausgewertete Wert ist wahr.

Begleitobjekt Singleton-Objekte, die mit demselben Namen in derselben Datei wie die Klasse definiert sind, werden als Begleitobjekte bezeichnet. Das Begleitobjekt hat privilegierten Zugriff auf die entsprechende Klasse. Zum Beispiel, wenn das Gewicht auf privat eingestellt ist


class Person(name: String, age: Int, private val weight: Int)

object Hoge {
  def printWeight(): Unit = {
    val taro = new Person("Taro", 20, 70)
    println(taro.weight)
  }
}

Ist NG,


class Person(name: String, age: Int, private val weight: Int)

object Person {
  def printWeight(): Unit = {
    val taro = new Person("Taro", 20, 70)
    println(taro.weight)
  }
}

Ist in Ordnung. Beachten Sie, dass selbst Begleitobjekte nicht auf Mitglieder von Klassen zugreifen können, die privat sind [this](nur innerhalb dieses Objekts zugänglich). Wenn Sie es einfach privat machen, ist es über das Begleitobjekt zugänglich.

Wenn Sie Code mit Begleitobjekten wie dem oben in REPL versuchen möchten, verwenden Sie unbedingt den Befehl REPL: Einfügen, um die Klasse und das Begleitobjekt zusammenzufügen. Die Klasse und das Begleitobjekt müssen sich in derselben Datei befinden. Wenn Sie sie jedoch separat in REPL eingeben, erkennt REPL die Begleitbeziehung nicht korrekt.


scala> :paste
// Entering paste mode (ctrl-D to finish)

class Person(name: String, age: Int, private val weight: Int)

object Person {
  def printWeight(): Unit = {
    val taro = new Person("Taro", 20, 70)
    println(taro.weight)
  }
}

// Exiting paste mode, now interpreting.

defined class Person
defined object Person

Recommended Posts

Ich habe Scala ~ [Objekt] ~ berührt
Ich habe Scala berührt
Ich habe Scala ~ [Klasse] ~ berührt
Ich habe Scala ~ [Trate] ~ berührt
Ich habe Scala ~ [Steuerungssyntax] ~ berührt
Ich habe zuerst Java touched berührt
Ich habe zuerst Java touched berührt
Ich habe zuerst Java touched berührt
Ich habe Scala ~ [Typparameter und Verschiebungsspezifikation] ~ berührt
Ich habe zuerst Java berührt
Ich ging zur Scala Fukuoka 2019!
Ich habe Cassandras Object Mapper für Java ausprobiert
Ich habe einen Öko-Server mit Scala gemacht
Ich habe ODM für Entwickler ② Regelentwicklung berührt