Scala macht (viele) setter + getter – Methoden überflüssig

Ich schreibe gerade mein  erstes richtiges Java-Programm.

(Ich komme von Perl5.) Objektorientierung ist super, hilft Dir wunderbar effiziente Strukturen zu bauen. Aber: Dieses ganze Schreiben von setter- und getter-Methoden… Du brauchst pro Instanzvariable und Klasse immer 3 Methoden:

– 1x setter

– 1x getter

– 1x JUnit – Test, um sicher zu sein, dass sie funktionieren (Ich habe mal eine Variable, die jede Sekunde einen Meßwert bekommen sollte, auf einen konstanten Wert gesetzt um etwas zu testen – und das dann vergessen zu entfernen. Zum Glück ließen sich die Messungen wiederholen! Seitdem teste ich sowas.)

Für jede Klasse die deine Klasse enthält brauchst Du wieder diese 3 Methoden (wenn Du es richtig machen willst). Macht 3 Hierarchie-Stufen = 9 Methoden, 5 Hierarchie-Stufen = 15 Methoden usw.

Vielleicht übertreibe ich, aber laut Lehrbuch soll man es so machen. Meine Rettung heißt Scala (Scala Homepage). Angeblich braucht man hier keine setter + getter – Methoden zu schreiben, weil Scala beim Zugriff auf Instanzvariablen selber welche erzeugt UND Du – falls Du sie brauchst – eine Instanzvariable gegen eine setter und eine getter – Methode austauschen kannst – OHNE DAS DER CLIENT (= der Code, der das von deiner Klasse abgeleitete Objekt benutzt) DAS MERKT! Vorausgesetzt, Du mußt nur einen Wert übergeben / lesen.

Wie geht das?! Der Benutzer bhorner aus dem Scala-Forum („Re: No need to write setter?“ in scala-forum.org) half mir weiter. Hier ist ein funktionsfähiges Scala-Programm basierend auf seinem Code:

package de.mgmechanics.test01
object InfixNotationApp {
 class A {
 var x = 11
 }
// the class above is equivalent to the class below
 class B {
 private var xValue = 11
 def x = xValue
 def x_=(value: Int) = {xValue = value}
 }
 def main(args : Array[String]) : Unit = {
 var m = new A
 m.x = 22
 m x = 14  // this also works!
 //m x 13  // this doesn't work
 m.x_=(13)  // this _does_ work
 m x_=(12)  // this works too!
 m x_= 11  // this even works.
 var n = new B
 n.x = 22
 n x = 14  // this also works!
 //n x 13  // this doesn't work
 n.x_=(13)  // this _does_ work
 n x_=(12)  // this works too!
 n x_= 11  // this even works.
 }
}

Man kann also z.B. mit

objekt variable/methode = wert

sowohl einer Instanzvariable einen Wert zuweisen als auch eine Methode mit dem Wert als einzigem Parameter aufrufen. Der Trick liegt in der Implementation der Methode x_ in der zweiten Klasse:

def x_=(value: Int) = {xValue = value}

(1) Man muß an den (ehemaligen) Variablennamen einen Unterstrich anhängen (= damit heißt die Methode genauso wie die, die sonst Scala für einen erzeugen würde, wenn man direkt auf die Instanzvariable zugreift – somit wird die generierte Methode durch die selbst-definierte Methode überschrieben).

(2) Zwischen Methodennamen und Parameterdefinition muß ein „=“ stehen.

Veröffentlicht in Scala. Kommentare deaktiviert für Scala macht (viele) setter + getter – Methoden überflüssig
%d Bloggern gefällt das: