gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:28:38 25 4
gpt4 key购买 nike

我研究了一些类及其声明,发现了一种新的封装方式,它使得访问实例变量的普通 getter/setter 方式看起来像野蛮行为......

内部javafx.scene.Scene搜索相机,javafx.scene.Camera 的对象并查看它的封装。

您还可以在 grepcode.com 上看到它

下面的内容来自 JavaFX Scene 类:

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在没有真正被获取之前不会被初始化。

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

这个答案中也有同样的解释: Exposing properties for binding

关于JavaFX:公开 ObjectProperty 成员而不是 getter/setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46585794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com