Stand: 10. September 2013
Einstieg
Viele Java - Frameworks setzen voraus, dass die Daten (Felder) einer Klasse im Bean-Style zur Verfügung
gestellt werden. Also es werden setter- und getter-Methoden für die Felder erwartet. In Scala ist der
Zugriff auf die Felder einer Klasse mithilfe dieser Methoden nicht üblich. Um aber unsere Scala Beans
für die Verwendung in Java Frameworks fit zu machen stellt uns Scala die Annotation
@BeanProperty
zur Verfügung. Für Felder, die mit dieser Annotation versehen sind,
generiert der Scala Compiler entsprechende "Bean Styled" Methoden. Für var
Felder werden setter und getter generiert. Für val
Felder werden nur getter generiert.
Bevor wir @BeanProperty
(und auch @BooleanBeanProperty
) verwenden können
müssel wir es geeignet in den aktulenne Sichtbarkeitsbereich importieren (oder den voll-qualifizierenden
Namen verwenden).
Standardfelder
In Projekten, wo Java und Scala gemischt eingesetzt werden, bietet diese Annotation auch den Vorteil,
dass wir in den Java Klassen auf die Felder von Scala Klassen in gewohnter Java Weise zugreifen können,
ohne die in Java etwas kryptischen Scala Bezeichnungen (z.B. model.value_$eq(value)
) verwenden zu müssen.
Nachfolgend ein Beispiel zur Verwendung von @BeanProperty
in Scala und zum Zugriff aus
einer Java Klasse.
import scala.beans.BeanProperty import scala.beans.BooleanBeanProperty class ScalaBean { @BeanProperty val value1 = 42 @BeanProperty var value2 = 44 }
public class BeanTest { public static void main(String[] args) { ScalaBean beanTest = new ScalaBean(); System.out.println(beanTest.getValue1()); System.out.println(beanTest.getValue2()); beanTest.setValue2(94); System.out.println(beanTest.getValue2()); } }
Die Ausführung des Programms führt zu folgender Ausgabe auf der Systemausgabe:
42 44 94
Arbeiten wir mit Variablen des Typs Boolean
wollen wir in den meisten Fällen
keine getTheBoolean
Methoden, sondern eine Methode der Form isTheBoolean
,
welche den Wert des Boolean
zurückliefert. Um dies zu erreichen, verwenden
wir anstelle des @BeanProperty
die Annotation @BooleanBeanProperty
für
die entsprechende Variable. Auch hier gilt, dass nur im Falle einer veränderlichen
var
- Variable entsprechende Setter erzeugt werden.
import scala.beans.BooleanBeanProperty object Main { def main(args: Array[String]): Unit = { val booleanBeanDemo = new BooleanBeanDemo() println(booleanBeanDemo.isValBoolean()) println(booleanBeanDemo.isVarBoolean()) println("----------------------------") booleanBeanDemo.setVarBoolean(false) println(booleanBeanDemo.isValBoolean()) println(booleanBeanDemo.isVarBoolean()) } } class BooleanBeanDemo { @BooleanBeanProperty var varBoolean = true @BooleanBeanProperty val valBoolean = false }
Die Ausführung des Programms führt zu folgender Ausgabe auf der Systemausgabe:
false true ---------------------------- false false
Konstruktoren
Um automatisch Setter und Getter erzeugen zu lassen, ist es nicht notwendig, diese Felder
im Rumpf der Klasse zu definieren. Wir können auch die entsprechenden Konstruktorenargumente
mit der @BeanProperty
Annotation versehen.
Versehen wir das entsprechende Feld zusätzlich mit val
, so werden automatisch Getter generiert.
Die Verwendung von var
führt dazu, dass auch entsprechende Setter generiert werden.
import scala.beans.BeanProperty class ClassProperties(@BeanProperty val value1: Double, @BeanProperty var value2: Double)
Nachfolgend ein Java-Programm, welches auf die entsprechenden Setter und Getter der Konstruktorenfelder zugreift.
public class JavaClass { public static void main(String[] args) { ClassProperties p = new ClassProperties(42.0, 47.11); System.out.println(p.getValue1()); System.out.println(p.getValue2()); p.setValue2(94.0); System.out.println(p.getValue2()); } }
Die Ausführung des Programms führt zu folgender Ausgabe auf der Systemausgabe:
42.0 47.11 94.0
Eine Definition von @BeanProperty
in Hilfskonstruktoren ist zwar möglich,
macht jedoch wenig Sinn, da die Feleder erst mit dem Primärkonstruktor innerhalb
der Klasse sichtbar werden.
Objektfelder
Die automatisierte Erzeugung von Settern und Gettern ist nicht auf "reine" Klassen beschränkt, sondern kann auch bei Singleton- und Companion Objekten angewendet werden.
import scala.beans.BeanProperty object ObjectProperties { @BeanProperty val objectVal = "meme" @BeanProperty var objectVar = "Hello" def main(args: Array[String]): Unit = { new Test() } } class Test() { println(ObjectProperties.getObjectVal()) println(ObjectProperties.getObjectVar()) ObjectProperties.setObjectVar("World") println(ObjectProperties.getObjectVar()) }
Die Ausführung des Programms führt zu folgender Ausgabe auf der Systemausgabe:
meme Hello World