Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX:公开ObjectProperty成员而不是getter/setter?_Java_Oop_Javafx_Properties_Encapsulation - Fatal编程技术网

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

JavaFX:公开ObjectProperty成员而不是getter/setter?,java,oop,javafx,properties,encapsulation,Java,Oop,Javafx,Properties,Encapsulation,我已经研究了som类及其声明,我发现了一种新的封装方式,这种封装方式使到达实例变量的普通getter/setter方式看起来很野蛮 在javafx.scene.scene中搜索camera,一个javafx.scene.camera的对象,并查看它的封装 你也可以在这里看到它 下面的内容来自JavaFX场景类: private ObjectProperty摄像机; 公共最终无效设置摄影机(摄影机值){ cameraProperty().set(值); } 公共最终摄像机getCamera(){

我已经研究了som类及其声明,我发现了一种新的封装方式,这种封装方式使到达实例变量的普通getter/setter方式看起来很野蛮

javafx.scene.scene
中搜索camera,一个
javafx.scene.camera
的对象,并查看它的封装

你也可以在这里看到它

下面的内容来自JavaFX场景类:

private ObjectProperty摄像机;
公共最终无效设置摄影机(摄影机值){
cameraProperty().set(值);
}
公共最终摄像机getCamera(){
返回camera==null?null:camera.get();
}
公共最终对象属性cameraProperty(){
如果(摄像机==null){
camera=新的ObjectPropertyBase(){
相机oldCamera=null;
@凌驾
受保护无效(){
摄像头_值=获取();
如果(_值!=null){
透视照相机的if(_值实例)
&&!Platform.isSupported(ConditionalFeature.SCENE3D)){
字符串logname=Scene.class.getName();
PlatformLogger.getLogger(logname).警告(“系统无法支持”
+“条件特征场景3d”);
}
//非法值,如果它属于其他场景或任何子场景
if((_value.getScene()!=null&&u value.getScene()!=Scene.this)
||_value.getSubScene()!=null){
抛出新的IllegalArgumentException(\u值
+“已经是其他场景或亚场景的一部分”);
}
//如果相机已具有其他所有者,则引发异常
_value.setOwnerScene(Scene.this);
_setViewWidth(getWidth());
_setViewHeight(getHeight());
}
if(oldCamera!=null&&oldCamera!=\u值){
旧摄像头。setOwnerScene(空);
}
旧相机=_值;
}
@凌驾
公共对象getBean(){
返回场景。这个;
}
@凌驾
公共字符串getName(){
返回“照相机”;
}
};
}
返回摄像机;
}
摄像头getEffectiveCamera(){
最终摄像头=getCamera();
if(cam==null
||(透视照相机的cam实例
&&!Platform.isSupported(ConditionalFeature.SCENE3D))){
如果(defaultCamera==null){
defaultCamera=新的ParallelCamera();
defaultCamera.setOwnerScene(此);
defaultCamera.setViewWidth(getWidth());
defaultCamera.setViewHeight(getHeight());
}
返回照相机;
}
回程凸轮;
}
什么时候我应该使用这种将实例变量放入
javafx.beans.property.ObjectProperty
中并添加额外的抽象层的方法,它将如何或以什么方式有用


注意:我知道将侦听器添加到属性的可能性,但是还有其他原因吗?

这里可以看到的是一种延迟初始化的实现

属性
camera
在未真正获取之前不会初始化

代码段中不存在“额外的抽象层:
cameraProperty()
公开
camera
内部属性(并在第一次调用时对其进行初始化)。访问器和mutator方法是指向
cameraProperty().get()
cameraProperty().set(…)
的简单快捷方式

答案中也解释了这一点:

它是否也允许在第一次set方法调用(初始化)和以后使用set方法(更改实例变量)之间进行分离,以便可以对它们进行不同的编码?这意味着您可以单独且唯一地初始化所有实例变量(而不是使用通用的init方法)。谢谢,延迟初始化是有意义的,现在知道术语“延迟初始化”很好!唯一的区别是(除了
camera
是一个“特殊”属性-这意味着它没有初始化为
new SimpleObjectProperty()
)之外,camera没有在costructor中初始化,但是只有在请求该属性用于任何用途时才延迟初始化。如果我仍然将
cameraProperty.set(值)
在Constructor中,我们使用了三种方法(总共设置了camera1、camera2和camera3)。我正在同时初始化它们-但我可以为每个摄影机(在内部)
cameraProperty
执行不同的操作。我认为这是在实例变量周围放置
ObjectProperty
的另一个好处。另一种选择是使用单独的init方法——我认为它没有“包装”那么吸引人
cameraProperty()
返回成员变量
camera
cameraProperty()
是一个方法。如果只检查实例变量是否为null会怎么样。执行延迟初始化不需要使用
objectproperty
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;
}