カメラ用...JavaFX:getter/setterではなくObjectPropertyメンバーを公開していますか?
検索javafx.scene.Scene
内部を私はSOMクラスとその宣言に見ていると私は野蛮のようなインスタンス変数を見て到達し、通常のゲッター/セッターの方法を作るカプセル化の新しい方法をarcross来ます、 javafx.scene.Camera
のオブジェクトとカプセル化を見てください。あなたはまた、以下のgrepcode.com
この下に、ここでそれを見ることができ
はJavaFXのシーンクラスからです:
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>
内のインスタンス変数を置くこの方法論を使用して追加する必要があります場合には余分な抽象化レイヤー、どのようにして有用なのでしょうか?
注意:私はプロパティにリスナーを追加する可能性について認識していますが、その他の理由がありますか?
それはまた、setメソッド(インスタンス変数の変更)の最初のセットメソッドの呼び出し(初期化)の間で分離し、後で使用することができません - 彼らができるように、異なってコード化されますか?これは、(initメソッドを一般化するのではなく)すべてのインスタンス変数を別々にかつ一意に初期化できることを意味します。そして初期化を遅らせることは理にかなっており、今や「遅延初期化」という用語を知っておくとよいでしょう! – lelelo
唯一の違いは、 'camera'は"特別な "プロパティです - すなわち、' new SimpleObjectProperty() 'で初期化されていないことを意味します)は、カメラがcostructorで初期化されていません。プロパティは任意の使用のために要求されます。 – DVarga
私はまだコンストラクタに 'cameraProperty.set(value)'を入れて、そのような3つのメソッド(camera1、camera2、camera3を合計で設定する)を設定します。私は同時にそれらを初期化していますが、カメラごとに(カメラの内部で)異なった方法で行うことができます。私はそれがインスタンス変数の周りに 'ObjectProperty'を置く別の利点だと思います。代わりに別のinitメソッドを持っている - それは私が思うように魅力的ではないように思われる – lelelo