/**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); }
1条答案
按热度按时间n6lpvg4x1#
当我们从swing切换到javafx时,我帮助我们公司设计并(重新)构建了一个大型javagui应用程序。我们预先做出的一个基本决定是全盘接受javafx属性。我们在所有的模型代码中都使用了它们,甚至在与gui没有任何联系的后端代码中也是如此。
非常重要:这与将我们的模型设计为单线程密切相关。尤其是,所有的模型更新都必须在javafx线程上完成。由于我们以前的应用程序是多线程的,人们不愿意放弃这个想法,所以对这个想法有很大的抵制。长话短说,我们将所有的i/o和计算转换为非阻塞的。做了很多工作,但最终还是成功了。如果你不阻塞,一个线程可以做很多工作。这个决定几乎单枪匹马地消除了所有的竞争条件和其他多线程错误,这在我的书中是一个巨大的胜利。
使用javafx属性是一个伟大的决定,我衷心推荐它。在代码风格方面,我们看到了很多好处:很容易听取属性更改,很容易添加动态更新其他属性的React式代码,很容易注册函数风格绑定,可以让我们使用类似这样的习惯用法
map
以及reduce
在我们的代码中。唯一真正的缺点是增加了很多样板。声明一个新属性基本上需要4-6行代码。您需要属性变量、getter、setter和底层属性对象的getter。为了节省垂直空间,我坚持将这些项压缩为每行一行,并将它们放在一起,而不是分散在源文件中。例如: