2017-10-05 10 views
1

カメラ用...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>内のインスタンス変数を置くこの方法論を使用して追加する必要があります場合には余分な抽象化レイヤー、どのようにして有用なのでしょうか?

注意:私はプロパティにリスナーを追加する可能性について認識していますが、その他の理由がありますか?

答えて

1

ここでは、遅延初期化の実装方法の1つについて説明します。

プロパティcameraは、実際に取得されない限り初期化されません。

スニペットに「特別な抽象化レイヤー」がありません。cameraProperty()cameraの内部プロパティを公開しています(最初の呼び出しで初期化されます)。アクセサーメソッドとミューテータメソッドは、cameraProperty().get()cameraProperty().set(...)の簡単なショートカットです。

同じはこの回答で説明されています。 Exposing properties for binding

+0

それはまた、setメソッド(インスタンス変数の変更)の最初のセットメソッドの呼び出し(初期化)の間で分離し、後で使用することができません - 彼らができるように、異なってコード化されますか?これは、(initメソッドを一般化するのではなく)すべてのインスタンス変数を別々にかつ一意に初期化できることを意味します。そして初期化を遅らせることは理にかなっており、今や「遅延初期化」という用語を知っておくとよいでしょう! – lelelo

+0

唯一の違いは、 'camera'は"特別な "プロパティです - すなわち、' new SimpleObjectProperty() 'で初期化されていないことを意味します)は、カメラがcostructorで初期化されていません。プロパティは任意の使用のために要求されます。 – DVarga

+0

私はまだコンストラクタに 'cameraProperty.set(value)'を入れて、そのような3つのメソッド(camera1、camera2、camera3を合計で設定する)を設定します。私は同時にそれらを初期化していますが、カメラごとに(カメラの内部で)異なった方法で行うことができます。私はそれがインスタンス変数の周りに 'ObjectProperty'を置く別の利点だと思います。代わりに別のinitメソッドを持っている - それは私が思うように魅力的ではないように思われる – lelelo

関連する問題