2014-09-19 16 views
5

Ich bin ein großer Fan der Javafx 2 Builder-Notation, jedoch wurde es in Java 8 veraltet und ich muss meinen alten Code in einer großen Codebasis ersetzen. Ich würde gerne einen ähnlichen Programmierstil beibehalten. Jetzt könnte ich die doppelte Klammerinitialisierung verwenden, aber ich mag es nicht, so viele anonyme innere Klassen zu erstellen, und ich fand, dass es manchmal Probleme mit bestimmten Klassen verursachen kann. Ich dachte mir, dass es einen Weg geben muss, Lambda zu benutzen, um etwas Ähnliches zu erreichen und kam auf diese Idee.Verwenden von Java Lambdas zum Ersetzen von Javafx-Buildern

public class FXUtil { 
    public static <T> T build(T node, Consumer<T> initializer) { 
    initializer.accept(node); 
    return node; 
    } 
} 

So, jetzt kann ich meine Bauherren wie ersetzen so

Label label = FXUtil.build(new Label(), label -> { 
    label.setText("Text"); 
    label.setStyle("-fx-font-size: 20"); 
    label.setMinWidth(100); 
}); 

Das so schön wie die Erbauer nicht ganz oder Doppel Klammer Syntax, aber besser als nichts. Meine Frage ist, hat dies irgendwelche Nachteile ähnlich der Doppelstrebeninitialisierung? Das Objekt selbst ist keine anonyme Klasse, aber mache ich im Wesentlichen dasselbe, indem ich eine anonyme Klasse für das Lambda erstelle? Die Lambdas sollten Müll gesammelt werden, richtig? Muss ich mir jetzt darüber Sorgen machen, dass der Permgen Space in JDK8 verschwunden ist? Hat jemand anders eine bessere Möglichkeit, neben der Verwendung von FXML auch Javafx-Klassen zu initialisieren?

Edit: aktualisiert Beispiel mit Vorschlag von @BenjaminGale

+2

Soll das 'initializer.apply (node)' heißen? Was ist "Konstrukteur"? –

+3

Ich verstehe es nicht. Warum machst du es so kompliziert? Warum nicht einfach "Label label = new Label();" sagen, gefolgt von den drei "label.set ... (...);" Anweisungen? Es ist immer noch kürzer und benötigt weder anonyme innere Klassen noch Lambda-Ausdrücke ... – Holger

+0

@Holger Der Hauptvorteil besteht darin, dass die Erzeugung und Initialisierung von Objekten in einer einzigen Anweisung erfolgt. Dies macht den Code wartungsfreundlicher, da Sie das Objekt während des Refactorings nicht versehentlich von seiner Initialisierung trennen können, und es wird sofort ersichtlich, welche Eigenschaften das Objekt hat. Der andere Vorteil ist, dass Sie Objekte inline angeben können, so dass Sie einen deklarativen Programmierstil wie diesen haben. neue VBox ( FXUtils.build (neues Label(), Label -> label.setStyleClass ("title")), FXUtils.build (neues TextBox(), text -> text.setStyleClass ("input")), ); –

Antwort

3

ich den Nachteil übernehmen Sie sich beziehen mit doppelter Klammer Initialisierung ist, dass als innere Klasse es einen Verweis auf die einschließende Klasse erfasst, in dem es erstellt wurde. Das Lambda wird das nicht tun. (Und in der Oracle Hotspot JVM wird es auch nicht in eine anonyme innere Klasse kompiliert.)

Verwandte Themen