Die wichtigsten Neuerungen von JavaFX 1.2

Nachdem sich die Einführung von JavaFX von den ersten Vorversionen bis zu Finalversion 1.0 relativ lange hingezogen hat, haben die ersten Releasewechsel von der Version 1.0 bis zur Version 1.2 nur extrem kurz gedauert.

Diese Releasewechsel sind aber fast vollständig abwärtskompatibel, was man bei den Wechseln der Preversionen und besonders hin zur ersten Finalversion nicht behaupten kann.

Version 1.2 erweitert nun JavaFX hauptsächlich um einige Layout-Klassen und strukturiert das API in einigen Bereichen etwas um. Das ist aber vollkommen unkritisch.

Hier sind die aus meiner Sicht beiden wichtigsten Neuerungen von JavaFX 1.2 nochmal ausführlich aufgelistet. Insbesondere diejenigen, die auch jenseits spezieller bzw. erweiterter Programmierung Relevanz haben.

Mehrfachvererbung-Light über Mixins
Die m.E. wichtigste Erweiterung gleicht zuerst – Mixins. Grundsätzlich hat sich über die Jahre die Mehrfachverbung in der objektorientierten Programmierung als extrem kritisch herauskristalisiert. Nicht umsonst haben neuere objektorientierte Sprachen wie Java oder C# auf Mehrfachvererbung verzichtet.

In den ersten Versionen von JavaFX Script hat Sun jedoch wieder auf Mehrfachvererbung gesetzt. Das war aber auf Grund der sehr eingeschränkten Funkionalität von Funktionen/Operationen und der an Prototyping orientierten Umsetzung von Methoden relativ unkritisch.

Nichts desto trotzwurde Mehrfachvererbung in der Finalversion 1.0 von JavaFX Script explizit abgeschafft. Auch in der Version 1.1 gab es keine Mehrfachvererbung.

In der Version 1.2 wurde diese jedoch nun durch die Hintertür wieder – stark entschärft – reaktiviert. Offiziell gilt zwar immer noch, dass JavaFX nur Einfachvererbung unterstüzt, aber es gibt nun das Konzept der mixin-Klassen.

Mixins unterscheiden sich von normalen Klassen nur durch das Schlüsselwort mixin, das in der Deklaration auftaucht.

* So eine Klasse kann nicht direkt instanziert werden, dient aber als Superklasse (das kennt man ja von abstrakten Klassen).
* Eine mixin-Klasse kann auch abstrakte Methoden enthalten, die dann in der Subklasse überschrieben werden müssen, wenn diese nicht abstrakt sein soll.
* Und eine andere Klasse kann von beliebig vielen Mixins abgeleitet werden. Und dazu noch von maximal einer echten Klasse

Beispiel:
public mixin class A {

public var antwort_1 = „Die Antwort ist „;

}

public mixin class B {

public var antwort_2 = 42;

public abstract function gibMirDieAntwort():String;

}

public class C {

public var frage = „Aber wie lautet die Frage?“;

}

public class Anhalter extends C, A, B {

public override function gibMirDieAntwort():String {
return „{antwort_1}{antwort_2}“;
}

}

var o = new Anhalter();
println(o.gibMirDieAntwort());
println(o.frage);

Und das ist die Ausgabe:

Die Antwort ist 42
Aber wie lautet die Frage?

Ein Problem gibt es jetzt noch, wenn aus verschiedenen Mixins identische Bezeichner für Funktionen oder Variablen vererbt werden. Das System verwendet die zuerst vererbte Variante! Also von der zuerst hinter extends notierten Klasse.

In gewisser Weise kann man also – innerhalb sehr strenger und einfacher Regeln – wieder von Mehrfachvererbung in JavaFX sprechen. Das Mixim- Konzept interpretiere ich als einen Zwitter zwischen (dem in JavaFX fehlenden) Schnittstellenkonzept und (eingeschränkter) echter Mehrfachvererbung.

Ich persönlich stelle mir ernsthaft die Frage, ob man so eine mehrfache Vererbung-Light wirklich benötigt? Ich bin zwiegespalten. Aber das Konzept schafft schon eine erhebliche Vereinfachung.

Native Arrays

JavaFX hat ja gegenüber Java das Konzept der Arrays bzw. allgemein Datenfeld-ähnlicher Konstrukte erheblich verändert und arbeitet mit so genannten Sequenzen. Diese haben so ihre ganz besonderen Eigenheiten (etwa das Einfügen von Elementen mit insert oder das Löschen mit delete).

Mit den neu ergänzten nativen Arrays kann man nur unter JavaFX Script auch echte Java-Arrays erzeugen. Im Wesentlichen soll damit der Datenaustausch zwischen Java und JavaFX vereinfacht werden.

Native Arrays werden mit dem Schlüsselwort nativearray deklariert.

Beispiel:

var ints : nativearray of Integer = [1..100] as nativearray of Integer;
for (i in ints) println(i);

Die vollständige Beschreibung der Änderungen finden Sie unter http://www.javafx.com/docs/articles/javafx1-2.jsp .

Kommentar verfassen