8

クラスの 1 つで JavaFx ObjectProperty を使用しています。バインド機能に使用しています。問題は、人々がそれにバインドできるようにしたいが、値を変更したくないということです。これを行うためのカースト証明の方法は考えられませんが(人々が外部から変更する方法がまったくない場合)、それを行う方法がいくつかあるに違いありません.

4

1 に答える 1

9

解決

ReadOnlyObjectWrapperを探しています。

サンプル

以下は、私が書いたサンプルの三目並べゲームから取った使用例です。

class Square {

  enum State { EMPTY, NOUGHT, CROSS }

  private ReadOnlyObjectWrapper<State> state = 
    new ReadOnlyObjectWrapper<>(State.EMPTY);

  public ReadOnlyObjectProperty<State> stateProperty() {
    return state.getReadOnlyProperty();
  }

  public State getState() {
    return state.get();
  }

  public void pressed() {
    if (!game.isGameOver() && state.get() == State.EMPTY) {
      state.set(game.getCurrentPlayer());
      ...
    }
  }
}

説明

これにより、Square の状態をプロパティで表すことができるため、Square の外部ユーザーは Square の状態にバインドできますが、状態自体は Square にカプセル化されているため、Square のみが自身の状態を変更できます。

このパターンの使用例は、Square を表す可視ノードを含む SquareSkin オブジェクトです。スキンは、関連する正方形の状態プロパティの変更をリッスンし、正方形を適切に表示するために使用する画像を更新できます。

ReadOnlyWrapper に含まれる Object 値を外部から変更できないようにするには、これらの Object 値を不変にするのが最善です(たとえば、Object には setter 関数がなく、getter 関数しかありません)。

さらなる例

私がリンクしたゲーム コードには、さまざまなバインド パターンと使用法の他の多くの例が含まれています (アプリで多くのバインドを使用するとどうなるかを確認するためのバインド演習として部分的に記述しました)。

于 2013-08-06T01:58:15.290 に答える