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
}
itmapa.de - X2H V 0.21

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());
  }
}
itmapa.de - X2H V 0.21

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  
}
itmapa.de - X2H V 0.21

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)
itmapa.de - X2H V 0.21

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());
  }
}
        
itmapa.de - X2H V 0.21

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())
}
itmapa.de - X2H V 0.21

Die Ausführung des Programms führt zu folgender Ausgabe auf der Systemausgabe:

meme
Hello
World