普通对象变量还是JavaFX对象属性?

Jin*_*Kim 2 java javafx

我正在开发一个 JavaFX 应用程序并尝试遵循模型-视图-控制器模式。我已经用普通的 java 对象(双精度、整数、字符串...)实现了模型,认为我会在非 JavaFX 项目中重用该模型。然而,我发现在没有属性的情况下,当模型发生变化时,很难使视图自动更新。在将每个变量更改为属性之前,我想问一下仅使用 JavaFX 属性来实现模型是否正确。

Joh*_*ica 5

当我们从 Swing 切换到 JavaFX 时,我帮助为我的公司设计和(重新)架构了一个大型 Java GUI 应用程序。我们预先做出的基本决定之一是大规模采用 JavaFX 属性。我们在所有模型代码中都使用了它们,甚至在与 GUI 没有任何联系的后端代码中也是如此。

非常重要:这与将我们的模型设计为单线程密切相关。特别是,所有模型更新都必须在 JavaFX 线程上完成。由于我们之前的应用程序是高度多线程的,因此人们不愿意放弃这个想法,因此这个想法受到了很大的阻力。长话短说,我们将所有 I/O 和计算都切换为非阻塞。虽然工作量很大,但最终还是成功了。事实证明,如果你从不阻塞,单个线程可以完成很多工作。这个决定几乎单枪匹马地消除了我们所有的竞争条件和其他多线程错误,这在我的书中是一个巨大的胜利。

使用 JavaFX 属性是一个伟大的决定,我衷心推荐它。在代码风格方面,我们看到了很多优点:很容易监听属性更改,很容易添加动态更新其他属性的反应性代码,很容易注册函数式绑定,这可以让我们在整个代码中使用类似map的习惯用法。reduce

唯一真正的风格缺点是添加了很多样板。声明一个新属性基本上需要 4-6 行代码。您需要属性变量、一个 getter、一个 setter 和一个底层属性对象的 getter。为了节省垂直空间,我坚持将这些项目压缩为每行,并将它们放在一起而不是分散在整个源文件中。例如:

/** User's first and last name. */
private final StringProperty nameProperty = new StringProperty("name");
public ReadOnlyStringProperty nameProperty() { return nameProperty; }
public String getName() { return nameProperty.get(); }
private void setName(String name) { nameProperty.set(name); }
Run Code Online (Sandbox Code Playgroud)