我正在编写一个新应用程序,为了灵活性我选择使用 Java。它是一个 GUI 应用程序,所以我将使用 JavaFX。这是我第一次使用 Java,但我有使用 C# 的经验。
我正在熟悉 JavaFX 属性,它们看起来像是前端和后端之间双向绑定(bind)的好方法。
我的代码使用开源 API 中的类,我想将这些类的成员转换为 JavaFX 属性(String => StringProperty 等)。我相信这对于引用这些成员的任何对象都是透明的。
这样做可以吗? 这是处理现有类的建议方法吗? 对于枚举类型我该怎么办?例如。枚举成员的值发生了变化,我应该如何将枚举成员连接到前端?
谢谢:)
最佳答案
一般来说,只要您不更改类的公共(public) API - 换句话说,您不删除任何公共(public)方法,修改其参数类型或返回类型,或更改其功能 - 您就不应该破坏使用它们的任何代码。
所以,例如更改自
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
的任何客户端。唯一可能的问题是子类 Foo
的类并被覆盖getBar()
和/或setBar(...)
如果它们的父类(super class)被新的实现替换,可能会出现意外的行为(具体来说,如果 getBar()
和 setBar(...)
不是最终的,则您无法强制执行 getBar()==barProperty().get()
,这是可取的)。
对于枚举(和其他对象),您可以使用 ObjectProperty<>
:
给定
public enum Option { FIRST_CHOICE, SECOND_CHOICE, THIRD_CHOICE }
然后你就可以了
public class Foo {
private final ObjectProperty<Option> option = new SimpleObjectProperty<>();
public ObjectProperty<Option> optionProperty() {
return option ;
}
public Option getOption() {
return optionProperty().get();
}
public void setOption(Option choice) {
optionProperty().set(choice);
}
}
对所有这些的一个警告是,您确实引入了对 JavaFX API 的依赖关系,而这些依赖关系以前并不存在于这些类中。 JavaFX 随 Oracle JDK 一起提供,但它不是 JSE 的完整部分(例如,默认情况下它不包含在 OpenJDK 中,也不包含在其他一些 JSE 实现中)。因此,在实践中,您不太可能说服开源库的开发人员接受您对库中的类的更改。由于它是开源的,您当然可以使用 JavaFX 属性维护自己的库分支,但是如果您想合并该库的新版本,就会变得很棘手(本质上,您将需要合并两组不同的更改) .
另一个选择是在类中使用绑定(bind)属性,并使用 Java Bean 属性适配器包装它们。 this question 中对此进行了描述。 .
关于api - JavaFX 用简单属性包装现有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35219394/