Definition String/SimpleStringProperty/StringProperty

jimb0p

Erfahrenes Mitglied
Hallo Zusammen,

diesmal habe ich eine Verständnisfrage. Ich verstehe nicht genau worin der Unterschied zwischen dem Datentyp String, SimpleStringProperty und StringProperty besteht. Weil an sich übergebe ich im Code immer nur einen String. Oder wenn ich eine Klasse habe die bspw. das enthält:

Java:
private StringProperty cName;

Wie sieht dann die korrekte Setter Methode aus denn es funktionieren zwei Möglichkeiten und ich verstehe auch hier nicht den Unterschied:
Java:
public void setcName(String cName) {
    this.cName.set(cName);
}

//oder
public void setcName(String cName) {
    this.cName = new SimpleStringProperty(cName);
}

Wäre super wenn mir hier jemand ein paar Worte zu sagen kann, bei Google werde ich nicht ganz fündig.
Gruß!
 

Cromon

Erfahrenes Mitglied
Hallo jimb0p

Die Dokumentation ist da relativ ausführlich. String ist ja glaub logisch, das ist halt einfach ein normaler String ohne drum und dran. StringProperty ist eine abstrakte Klasse und unterscheidet sich schon insofern von einem einfachen String indem er die folgenden Interfaces unterstützt:

Eine Implementation von StringProperty wiederum ist dann zum Beispiel SimpleStringProperty. Insofern ist dein Setter nicht so elegant, besser wäre es dein cName anfänglich mit einer neuen Instanz zu initialisieren und anschliessend in setcName entsprechend cName.setValue aufrufen. Anschliessend kannst du ein binding erstellen, das dann informiert wird, wenn der Wert verändert wird.

Viele Grüsse
Cromon
 

jimb0p

Erfahrenes Mitglied
Hi Cromon,

danke für deine Antwort, hättest du einen ungetesteten Codeschnipsel für mich, kann dir nicht ganz folgen.

Gruß!
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

die *Property Klassen sind vorallem für den Gebrauch mit JavaFX interessant.
Ein einfaches Beispiel wäre:
Java:
public class Test {
	private StringProperty username = new SimpleStringProperty();

	public final String getUsername() {
		return usernameProperty().get();
	}

	public final void setUsername(final String username) {
		usernameProperty().set(username);
	}

	public final StringProperty usernameProperty() {
		return username;
	}
}

Wie du siehst werden im JavaFX Umfeld zusätzlich zu dem Getter- und Setter noch das Property selbst rausgegeben. Dies dient dazu, das Property an ein Element der Oberfläche (zum Beispiel ein Textfeld) zu binden. Sprich: Ändert der Benutzer an der Oberfläche den Inhalt des Textfeldes, so werden alle Änderungen sofort in das Property übernommen. Dies funktioniert je nach Binding auch in die andere Richtung.
Das Funktioniert nicht nur mit Strings, sondern ebenso auch mit Long, Integer, Date..... Grösster Vorteil meiner Meinung: Unter Swing musstest du je nach Komponente den Wert mit getValue(), getText(), get..Model().getSelectedValue() usw abrufen, jetzt gehst du einfach auf "meinModel.usernameProperty().get()" und bekommst auch gleich den gewünschten Datentyp.

Generell zu deiner Frage:
- String: Primitiver Datentyp
- StringProperty: Abstrakte Baseisklasse einer Property, die einen String speichern kann
- SimpleStringProperty: Die "Standardimplementierung" einer StringProperty mit allen Funktionen die man normal braucht.

Wenn du weitere Infos und Beispiel zu dem Thema anschauen willst, dann kannst du mal nach "Java 8 for the really impatient" googeln. Da findest du auf der ersten Seite einen Link auf Google Drive wo du das Buch zum Download findest, für dich relevant ist dann vorallem das Kapitel 4.

Grüsse,
BK