使用Java Lambdas替换javafx构建器

Bri*_*ski 5 java lambda javafx java-8 javafx-8

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

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

所以现在我可以像这样替换我的建造者

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

这不像构建器或双括号语法那么好,但总比没有好.我的问题是,这有任何类似于双括号初始化的缺点吗?对象本身不是一个匿名类,但我基本上是通过为lambda创建一个匿名类来做同样的事情吗?lambda应该是垃圾收集的,对吗?我现在甚至需要担心这个问题,因为在JDK8中permgen空间已经消失了吗?除了使用FXML之外,还有其他人有更好的方法来初始化javafx类吗?

编辑:更新的示例与@BenjaminGale的建议

Dav*_*rad 3

我假设您提到的双括号初始化的缺点是,作为内部类,它捕获对创建它的封闭类的引用。lambda 不会这样做。(并且,在 Oracle Hotspot JVM 上,它也不会编译为匿名内部类。)