JavaFX:公开ObjectProperty成员而不是getter/setter?
我已经研究了som类及其声明,我发现了一种新的封装方式,这种封装方式使到达实例变量的普通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(){
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;
}