2014-09-19 9 views
5

Jestem wielkim fanem notacji budowniczych Javafx 2, jednak został on przestarzały w Javie 8 i muszę zamienić mój stary kod w duży kod. Chciałbym zachować podobny styl programowania. Teraz mogę użyć inicjalizacji podwójnego nawiasu klamrowego, ale nie lubię tworzyć tak wielu anonimowych klas wewnętrznych i odkryłem, że czasami może powodować problemy z niektórymi klasami. Pomyślałem, że musi istnieć sposób użycia lambda do osiągnięcia czegoś podobnego i wymyślenia tego.Używanie Java Lambdas do zastąpienia konstruktorów javafx

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

Więc teraz mogę wymienić moje budowniczych jak tak

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

To nie jest tak ładny jak konstruktora lub składni podwójnym nawiasów, ale lepsze to niż nic. Moje pytanie brzmi: czy ma jakieś wady podobne do inicjowania podwójnego nawiasu? Sam obiekt nie jest klasą anonimową, ale czy zasadniczo robię to samo, tworząc anonimową klasę dla lambda? Lambda powinna być zbiorem śmieci, prawda? Czy muszę się tym martwić, skoro w JDK8 nie ma już wolnego miejsca? Czy ktokolwiek inny ma lepszy sposób inicjowania klas javafx oprócz używania FXML?

Edit: zaktualizowane przykład z sugestią @BenjaminGale

+2

Czy to ma się nazywać 'initializer.apply (node)'? Co to jest "konstruktor"? –

+3

Nie rozumiem tego. Dlaczego w ogóle jest to tak skomplikowane? Dlaczego nie po prostu powiedzieć "Label label = new Label();", a następnie trzy instrukcje 'label.set ... (...);'? Jest jeszcze krótszy i nie wymaga ani anonimowych klas wewnętrznych ani wyrażeń lambda ... – Holger

+0

@Holger Główną zaletą jest to, że tworzenie i inicjowanie obiektów odbywa się w pojedynczej instrukcji. Dzięki temu kod staje się łatwiejszy w utrzymaniu, ponieważ nie można przypadkowo podzielić obiektu od jego inicjalizacji podczas refaktoryzacji, a od razu widać, jakie właściwości ma obiekt. Inną zaletą jest to, że możesz określać obiekty w linii, dzięki czemu możesz mieć więcej deklaratywnego stylu programowania, jak ten. nowy VBox ( FXUtils.build (nowa etykieta(), etykieta -> etykieta.setStyleClass ("tytuł")), FXUtils.build (nowa TextBox(), tekst -> text.setStyleClass ("wejście")), ); –

Odpowiedz

3

Zakładam taką wadę, masz na myśli z podwójnym inicjalizacji nawiasów jest to, że jako wewnętrzna klasy ujmuje odwołanie do klasy okalającego, w której został utworzony. Lambda tego nie zrobi. (A w JVM Oracle Hotspot również nie jest kompilowany do anonimowej klasy wewnętrznej).