使用<fx:root> </fx:root>时在构造函数中泄漏'this'

时间:2014-10-18 11:02:35

标签: java javafx fxml fxmlloader

Introduction to FXML举例说明如何使用&lt; fx:root&gt;构建自定义组件。以下是该文档的一些片段:

public CustomControl() {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("custom_control.fxml"));
    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);

    try {
        fxmlLoader.load();
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }
}

这里,构造函数正在泄漏&#39;这个&#39;这可能会导致some unpleasure consequence

通过&#39;这是否安全?到构造函数中的FXMLLoader?如果没有,是否有任何建议使这段代码安全?

1 个答案:

答案 0 :(得分:1)

考虑到该示例来自 docs.oracle.com 以及他们使用它来演示功能的事实,我认为它应该是安全的。不过,你提出了一个很好的观点。

您可以做的是尝试避免同时代表根和控制器的类。从语义上讲,将它们分开会更好。因此,在上面的示例中,您可以将CustomBox extends VBox fx:rootCustomBoxController fx:controller作为var dictionary1 = [String:Int]() var dictionary2: [String:Int] = [:] var dictionary3 = Dictionary<String, Int>() var dictionary4: Dictionary<String, Int> = [:] ,并将初始化负担放在.fxml上。

我想至少你可以使用这种组合自定义控件的某种包装器。然后包装器将创建控制对象,用它初始化加载器并最终加载它。如果您有多个此类,则可以使用相同的包装器来初始化所有自定义控件。