使用Java Lambdas替换javafx构建器

时间:2014-09-19 22:02:32

标签: 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;
  }
}

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

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的建议

1 个答案:

答案 0 :(得分:3)

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