2014-09-19 39 views
5

我是Javafx 2构建器表示法的忠实粉丝,但它在Java 8中已被弃用,我需要在大型代码库中替换旧代码。我想保持类似的编程风格。现在我可以使用双括号初始化,但我不喜欢创建如此多的匿名内部类,并且我发现它有时会导致某些类出现问题。我认为必须有一种方法来使用lambda来完成类似的事情,并提出了这个问题。使用Java Lambdas替换javafx构建器

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

所以,现在我可以取代我的建设者,像这样

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

这是不太一样好建设者或双括号语法,但有总比没有好。我的问题是这有什么缺点类似于双大括号初始化?该对象本身不是一个匿名类,但我本质上是通过为lambda创建一个匿名类来做同样的事情? lambda应该被垃圾收集,对吗?我现在甚至需要担心JDK8中的转储空间消失了吗?除了使用FXML之外,其他人是否有更好的初始化javafx类的方法?

编辑:更新例如从@BenjaminGale

+2

是否应该说'initializer.apply(node)'?什么是'构造函数'? – 2014-09-19 22:10:54

+3

我不明白。为什么你把它变得如此复杂?为什么不简单地说'Label label = new Label();',接着是三个'label.set ...(...);'语句?它仍然更短,不需要,匿名内部类或lambda表达式... – Holger 2014-09-22 08:41:35

+0

@Holger主要优点是对象的创建和初始化发生在一个语句中。这使代码更易于维护,因为在重构时不会意外地将对象从其初始化中分离出来,并且更直观地显示对象具有哪些属性。另一个好处是你可以指定内联对象,这样你就可以拥有更多的声明式编程风格。 (新的Label(),label - > label.setStyleClass(“title”)), ); – 2014-09-22 16:47:50

回答

3

我想你指的是用双括号初始化缺点的建议是,作为一个内部类它捕捉到它创建的封闭类的引用。拉姆达不会那样做。 (而且,在Oracle Hotspot JVM上,它也不会被编译为匿名内部类。)