JavaFX:公开 ObjectProperty 成员而不是 getter/setter?

JavaFX: Exposing ObjectProperty members instead of getter/setter?

我研究了一些 classes 和它们的声明,我发现了一种新的封装方式,它使普通的 getter/setter 访问实例变量的方式看起来很野蛮......

javafx.scene.Scene里面搜索camera,javafx.scene.Camera的一个对象,看看它的封装。

您也可以在 grepcode.com

上看到它

下面这个来自 JavaFX 场景 class:

private ObjectProperty<Camera> camera;

public final void setCamera(Camera value) {
    cameraProperty().set(value);
}

public final Camera getCamera() {
    return camera == null ? null : camera.get();
}

public final ObjectProperty<Camera> cameraProperty() {
    if (camera == null) {
        camera = new ObjectPropertyBase<Camera>() {
            Camera oldCamera = null;

            @Override
            protected void invalidated() {
                Camera _value = get();
                if (_value != null) {
                    if (_value instanceof PerspectiveCamera
                            && !Platform.isSupported(ConditionalFeature.SCENE3D)) {
                        String logname = Scene.class.getName();
                        PlatformLogger.getLogger(logname).warning("System can't support "
                                + "ConditionalFeature.SCENE3D");
                    }
                    // Illegal value if it belongs to other scene or any subscene
                    if ((_value.getScene() != null && _value.getScene() != Scene.this)
                            || _value.getSubScene() != null) {
                        throw new IllegalArgumentException(_value
                                + "is already part of other scene or subscene");
                    }
                    // throws exception if the camera already has a different owner
                    _value.setOwnerScene(Scene.this);
                    _value.setViewWidth(getWidth());
                    _value.setViewHeight(getHeight());
                }
                if (oldCamera != null && oldCamera != _value) {
                    oldCamera.setOwnerScene(null);
                }
                oldCamera = _value;
            }

            @Override
            public Object getBean() {
                return Scene.this;
            }

            @Override
            public String getName() {
                return "camera";
            }
        };
    }
    return camera;
}

Camera getEffectiveCamera() {
    final Camera cam = getCamera();
    if (cam == null
            || (cam instanceof PerspectiveCamera
            && !Platform.isSupported(ConditionalFeature.SCENE3D))) {
        if (defaultCamera == null) {
            defaultCamera = new ParallelCamera();
            defaultCamera.setOwnerScene(this);
            defaultCamera.setViewWidth(getWidth());
            defaultCamera.setViewHeight(getHeight());
        }
        return defaultCamera;
    }

    return cam;
}

我什么时候应该使用这种将实例变量放入 javafx.beans.property.ObjectProperty<T> 并添加额外抽象层的方法,它如何或以什么方式有用?

注意:我知道可以向属性添加侦听器 - 但还有其他原因吗?

你在这里看到的是一种惰性初始化的实现。

属性 camera 在没有真正被获取之前不会被初始化。

片段中不存在 "extra abstraction layer":cameraProperty() 公开 camera 内部 属性(并在第一次调用时对其进行初始化)。访问器和修改器方法是 cameraProperty().get()cameraProperty().set(...) 的简单快捷方式。

在这个回答中也有同样的解释: