apply
Einen besonderen Status hat eine Methode mit dem Namen apply
.
Werden hinter einem Klassennamen runde Klammern verwendet,
bedeutet dies, das eine Methode mit dem Namen apply
auf dem Begleitobjekt (engl. companion object)
aufgerufen wird. Die Methode kann Parameterlos oder mit Parametern
versehen sein. Setzen wir die Klammern hinter einer Instanzvariablen, so bedeutet dies,
dass die apply
Methode der entsprechenden Klasse aufgerufen wird.
Ein Beispiel mit einer List
soll diese Methodik verdeutlichen:
val a = List(1,2,3) println(a(1))
Das obige Beispiel ist eine Kurzschreibweise für nachfolgende Quelltextzeilen:
val a = List.apply(1,2,3) println(a.apply(1))
Die Funktionsweise von apply
ist nicht auf Klassen der Standardbibliothek beschränkt,
sondern funktioniert auch für alle selbstdefinierten case classes.
object MyApply{ def apply() = new MyApply(0) } case class MyApply(v1 : Int) { override def toString = "My value is "+v1 def apply(v2 : Int) = v1 + v2 } object MyApplyTest { def main(args: Array[String]) { val t = MyApply(3) println(t(3)) } }
Im nachfolgenden Beispiel definieren wir eine apply
Methode
im Companion Objekt und in der Companion Klasse.
Im Hauptprogramm erzeugen wir ein Objekt durch Anwendung der apply
Mthode im Companion Objekt und ermitteln anschließend den auszugebenden
Wert mit der apply
Methode der Companion Klasse.
object Check{ def main(args: Array[String]): Unit = { val check = A() println(check()) } } object A { def apply() = new A(3) } class A (val intValue: Int) { def apply() = intValue }