应该如何公开属性?
例如:
class A{
private ObjectProperty<X> objx;
}
class B{
private ObjectProperty<X> objy;
}
我们想将 objy
绑定(bind)到 objx
或者从 B
添加一个监听器到 objx
。只为 objx
做一个 getter 可以吗?或者有没有办法制作一个用于绑定(bind)的包装函数并仅公开此函数?
最佳答案
class A {
private final ObjectProperty<X> objx = new SimpleObjectProperty<>();
public ObjectProperty<X> objxProperty() {
return objx ;
}
public final X getObjx() {
return objxProperty().get();
}
public final void setObjx(X objx) {
objxProperty().set(objx);
}
}
这里的想法是你有一个属性本身的访问器方法(一个“属性访问器”:objxProperty()
),它可以用于绑定(bind)和注册监听器,但属性也会出现作为常规Java Bean还有:即有标准的 get
和 set
方法。一般约定是您应该始终拥有 x.getObjx() == x.objxProperty().get()
,这是通过使 Java Bean 访问器方法(getObjx()
和 setObjx
) 最后。
如果您希望能够在内部修改该属性,但只想公开一个只读属性(其他代码可以绑定(bind)到该属性),请使用 ReadOnlyObjectWrapper
:
class A {
private final ReadOnlyObjectWrapper<X> objx = new ReadOnlyObjectWrapper<>();
public ReadOnlyObjectProperty<X> objxProperty() {
return objx.getReadOnlyProperty();
}
public final X getObjx() {
return objxProperty().get();
}
}
另请查看 this powerpoint presentation虽然很旧,但显示了很多有用的习语,例如属性的延迟和 super 延迟初始化。
关于java - 公开绑定(bind)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39349849/