2014-09-19 20 views
5

Tôi là một fan hâm mộ lớn của ký hiệu Javafx 2, tuy nhiên nó đã không được chấp nhận trong Java 8 và tôi cần phải thay thế mã cũ của tôi trong một codebase lớn. Tôi muốn giữ một phong cách lập trình tương tự. Bây giờ tôi có thể sử dụng đôi brace khởi tạo, nhưng tôi không thích tạo ra rất nhiều lớp bên trong vô danh và tôi thấy nó đôi khi có thể gây ra vấn đề với các lớp nhất định. Tôi đã tìm ra cách để sử dụng lambda để thực hiện một cái gì đó tương tự và đã đưa ra điều này.Sử dụng Java Lambdas để thay thế các nhà xây dựng javafx

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

Vì vậy, bây giờ tôi có thể thay thế các nhà xây dựng của tôi như vậy

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

Đây không phải là khá là tốt đẹp như những người xây dựng hoặc cú pháp cú đúp đôi, nhưng có còn hơn không. Câu hỏi của tôi là điều này có bất kỳ hạn chế tương tự như khởi động đôi cú đúp? Bản thân đối tượng không phải là một lớp vô danh, nhưng về cơ bản tôi có đang làm điều tương tự bằng cách tạo một lớp ẩn danh cho lambda không? Các lambdas nên được thu gom rác, đúng không? Tôi thậm chí có cần phải lo lắng về điều này bây giờ mà không gian permgen đã biến mất trong JDK8? Có ai khác có cách tốt hơn để khởi tạo các lớp javafx ngoài việc sử dụng FXML?

Edit: cập nhật ví dụ với đề nghị từ @BenjaminGale

+2

Điều đó có nghĩa là phải nói 'initializer.apply (node)'? 'Constructor' là gì? –

+3

Tôi không hiểu. Tại sao bạn làm cho nó phức tạp như vậy? Tại sao không đơn giản nói 'Label label = new Label();', theo sau là ba câu lệnh 'label.set… (…);'? Nó vẫn ngắn hơn và không yêu cầu cả, các lớp bên trong vô danh cũng như các biểu thức lambda… – Holger

+0

@Holger Ưu điểm chính là tạo và khởi tạo đối tượng xảy ra trong một câu lệnh duy nhất. Điều này làm cho mã dễ bảo trì hơn vì bạn không thể vô tình tách đối tượng khỏi khởi tạo của nó trong khi tái cấu trúc và nó rõ ràng hơn là những thuộc tính nào mà đối tượng có. Ưu điểm khác là bạn có thể chỉ định các đối tượng nội tuyến để bạn có thể có nhiều hơn một kiểu lập trình khai báo như thế này. VBox mới ( FXUtils.build (nhãn mới(), nhãn -> label.setStyleClass ("tiêu đề")), FXUtils.build (new TextBox(), text -> text.setStyleClass ("input")), ); –

Trả lời

3

tôi giả nhược điểm bạn đang đề cập đến với đôi khởi cú đúp là như một lớp bên trong nó chụp một tham chiếu đến lớp kèm theo, trong đó nó được tạo ra. Các lambda sẽ không làm điều đó. (Và, trên Oracle Hotspot JVM, nó cũng không được biên dịch thành một lớp bên trong vô danh.)

Các vấn đề liên quan