在 JavaFX 中使用大括号进行父组织

Using braces for parental organization in JavaFX

我正在用 JavaFX 编写用户界面,不希望使用 FXML。如下使用牙套组织儿童是否传统有效?大括号除了让代码看起来更好之外没有任何用处。编译时大括号会被完全优化掉吗?

HBox top = new HBox();
{
    Label white = new Label("White");
    white.getStyleClass().addAll("white-check");
    white.setMinWidth(160);
    white.setMinHeight(60);

    Label lightGray = new Label("Light Gray");
    lightGray.getStyleClass().addAll("lightgray-check");
    lightGray.setMinWidth(160);
    lightGray.setMinHeight(60);

    top.getChildren().addAll(white, lightGray);
}

让我知道我是否应该将其迁移到程序员 SE。

谢谢。

Is it conventionally and efficiently sound to organize children using braces as follows?

我认为这适合您的情况(您将重用变量名、单独的组件等)。

Will the braces be entirely optimized away when compiled?

是的,这只是定义范围的语言语法。

回答

从技术角度来看,我认为你的提议是可以的。

意见

从风格的角度来看,当真正需要 none 时,额外的大括号对我来说有点奇怪,因为我从未见过有人写过这样的代码。但是,它确实读起来不错,没有真正的技术开销,并且当您考虑下面的一些替代方案时,它不需要完全不同的方法,如 DSL 或额外的语法和类型构造,如创建额外的方法或 类.

我见过的更标准的完成方式是通过工厂方法或继承。例如:

备选方案

建设者

如果构建器仍然存在,那么自然而然的事情就是使用它们——但是构建器现在已被弃用,因此它们不是一个可行的替代方案。当 JavaFX 团队放弃构建器时,有许多替代建议(您可以通过关注 builder dropping thread 上的所有帖子找到这些建议),但我认为真正的标准替代品从未真正找到过,只是不同的选择。

工厂方法

HBox top = new HBox(
    createLabel("White", "white-check"),
    createLabel("Light Gray", "lightgray-check")
);
. . . 
public Label createLabel(String text, String styleClass) {
    Label label = new Label(text);
    label.getStyleClass().add(styleClass);
    label.setMinWidth(160);
    label.setMinHeight(60);

    return label
}

继承

HBox top = new HBox(
    new CustomLabel("White", "white-check"),
    new CustomLabel("Light Gray", "lightgray-check")
);
. . . 
public class CustomLabel extends Label {
    public CustomLabel(String text, String styleClass) {
        super(text);
        getStyleClass().add(styleClass);
        setMinWidth(160);
        setMinHeight(60);
     }
}

备用域特定语言

例如ScalaFX代码:

var top = new HBox {
  content = Seq(
    new Label {
      text = "White"
      styleClass = Seq("white-check")
      minWidth = 160
      minHeight = 60
    },
    new Label {
      text = "Light Gray"
      styleClass = Seq("lightgray-check")
      minWidth = 160
      minHeight = 60
    }
  )
}