我是Javafx 2构建器表示法的忠实粉丝,但它在Java 8中已被弃用,我需要在大型代码库中替换旧代码。我想保持类似的编程风格。现在我可以使用双括号初始化,但我不喜欢创建这么多匿名内部类,我发现它有时会导致某些类的问题。我认为必须有一种方法可以使用lambda来完成类似的事情并想出这个。
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中permgen空间已经消失了吗?除了使用FXML之外,还有其他人有更好的方法来初始化javafx类吗?
编辑:更新的示例,其中包含来自@BenjaminGale的建议
答案 0 :(得分:3)
我认为你所指的双括号初始化的缺点是作为一个内部类,它捕获对创建它的封闭类的引用。 lambda不会这样做。 (并且,在Oracle Hotspot JVM上,它也不会编译为匿名内部类。)