公开绑定属性

时间:2016-09-06 13:09:43

标签: java javafx properties

属性应该如何暴露?

例如:

class A{
    private ObjectProperty<X> objx;
}

class B{
    private ObjectProperty<X> objy;
}

我们希望将objy绑定到objx,或者从objxB添加一个监听器。为objx做一个吸气剂是不是很好?或者有没有办法制作一个包装函数来绑定并公开这个函数?

2 个答案:

答案 0 :(得分:5)

standard pattern

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}}:也就是说,有标准getset方法。一般合同是你应该始终拥有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在他的回答中解释的确是标准(方法命名与此处相同)。