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(...)
的简单快捷方式。
在这个回答中也有同样的解释:
我研究了一些 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(...)
的简单快捷方式。
在这个回答中也有同样的解释: