我正在编写一个新的应用程序,我选择使用Java来提高灵活性。它是一个GUI应用程序,所以我将使用JavaFX。这是我第一次使用Java,但我有使用C#的经验。
我熟悉JavaFX Properties,它们看起来像是前端和后端之间双向绑定的好方法。
我的代码使用来自开源API的类,我想将这些类的成员转换为JavaFX Properties(String => StringProperty等)。我相信这对于引用这些成员的任何对象都是透明的。
这样做可以吗? 这是处理现有类的建议方式吗? 我如何处理Enum类型?例如。枚举成员的值已更改,我应该如何将枚举成员连接到前端?
谢谢:)
答案 0 :(得分:5)
通常,只要您不更改类的公共API - 换句话说,您不删除任何公共方法,修改其参数类型或返回类型,或更改其功能 - 您不应该破坏任何使用它们的代码。
所以,例如从
改变public class Foo {
private String bar ;
public String getBar() {
return bar ;
}
public void setBar(String bar) {
this.bar = bar ;
}
}
到
public class Foo {
private final StringProperty bar = new SimpleStringProperty();
public StringProperty barProperty() {
return bar ;
}
public String getBar() {
return barProperty().get();
}
public void setBar(String bar) {
barProperty().set(bar);
}
}
不应该破坏班级Foo
的任何客户。唯一可能的问题是,如果将其超类替换为新实现(具体为{{1},那么具有子类Foo
且重写getBar()
和/或setBar(...)
的类可能会出现意外行为}}和getBar()
不是最终的,你无法强制执行setBar(...)
,这是可取的。
对于枚举(和其他对象),您可以使用getBar()==barProperty().get()
:
给出
ObjectProperty<>
然后你可以做
public enum Option { FIRST_CHOICE, SECOND_CHOICE, THIRD_CHOICE }
对所有这一点的一个警告是,您确实引入了以前在这些类中不存在的JavaFX API的依赖性。 JavaFX附带了Oracle JDK,但它不是JSE的完整部分(例如,默认情况下它不包含在OpenJDK中,并且不包含在其他一些JSE实现中)。所以在实践中,你不太可能说服开源库的开发人员接受你对库中类的更改。既然它是开源的,你当然可以使用JavaFX属性维护你自己的库的分支,但是如果你想要合并那个库的新版本(那么你需要合并两组不同的变化)它会变得棘手
另一种选择是在类中使用绑定属性,并使用Java Bean Property Adapter包装它们。这在this question。
中有所描述