属性应该如何暴露?
例如:
class A{
private ObjectProperty<X> objx;
}
class B{
private ObjectProperty<X> objy;
}
我们希望将objy
绑定到objx
,或者从objx
向B
添加一个监听器。为objx
做一个吸气剂是不是很好?或者有没有办法制作一个包装函数来绑定并公开这个函数?
答案 0 :(得分:5)
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()
),可用于绑定和注册监听器,但该属性也显示为常规{{ 3}}:也就是说,有标准get
和set
方法。一般合同是你应该始终拥有x.getObjx() == x.objxProperty().get()
,这是通过使Java Bean访问器方法(getObjx()
和setObjx
)最终实现的。
如果您希望能够在内部修改属性,但希望仅公开只读属性(其他代码可以绑定到该属性),请使用Java Bean:
class A {
private final ReadOnlyObjectWrapper<X> objx = new ReadOnlyObjectWrapper<>();
public ReadOnlyObjectProperty<X> objxProperty() {
return objx.getReadOnlyProperty();
}
public final X getObjx() {
return objxProperty().get();
}
}
另请查看ReadOnlyObjectWrapper
,虽然陈旧,却展示了许多有用的习惯用法,例如懒惰和超级懒惰的属性初始化。
答案 1 :(得分:4)
以下结构在JavaFX中广泛使用:
class A {
// Private inner property
private ObjectProperty<X> objx;
// Public property accessor method
public final ObjectProperty<X> objxProperty() {
if (objx == null)
objx = new SimpleObjectProperty<X>(DEFAULT_VALUE);
return objx;
}
// Public setter method
public final void setObjx(X val) {
objxProperty().set(val);
}
// Public getter method
public final X getObjx() {return objx == null ? DEFAULT_VALUE : objx.get();}
}
您在此处看到的内容称为lazy initialization。诀窍是私有内部属性在被(真的)被请求之前不会被初始化。
公共属性访问者objxProperty()
将初始化私有内部属性objx
。此属性访问器方法用于公开绑定和侦听的内部属性。私人内部财产获得&#34;财产&#34;后缀,可以视为JavaFX中的约定。
public setter方法setObjx
使用此属性访问器方法,因此,如果请求设置此属性的值,则将初始化内部属性。
在公共getter getObjx()
的情况下有点不同,好像内部属性尚未初始化(对属性没有直接访问请求,之前没有设置请求),默认值直接返回不初始化内部属性,进一步延迟初始化例程。
例如,如果JavaFX中TextField
为{{1}},您可以看到此技术。
如果你不想让事情变得复杂,那么&#34;标准模式&#34; James_D在他的回答中解释的确是标准(方法命名与此处相同)。