モデルでは、データオブジェクトフィールドは
IDataField
インターフェイスで表されます。 このインターフェースのパラメーターは、フィールド値のタイプを決定します。
インターフェースには、フィールド値の設定と読み取りにそれぞれ使用される
setValue
と
getValue
が含まれてい
setValue
。 したがって、たとえば、
IDataField<Integer>
フィールドの値は
setValue(Integer)
メソッドを使用して設定され、
getValue()
呼び出し(戻り値の型
Integer
)を使用して取得されます。
IDataField
フィールド
IDataField
の有効期間は、フィールドが含まれるデータオブジェクトインスタンス(
IDataObject
)の有効期間と同じです。 つまり、データオブジェクトフィールドの値はオブジェクトデータフィールドで繰り返し変更できますが、データオブジェクトのデータフィールドインスタンス(
IDataField
)は変更されません。
データオブジェクト(つまり、
IDataObject
型のオブジェクト)では、フィールドは定数として宣言されます:
final static FieldDeclaration<String> name = new FieldDeclaration<String>();
データオブジェクトの名前が
Department
ます。
Department.name
定数を指定することにより、データフィールドを参照できます。 データオブジェクト内のこの定数の宣言は、インスタンス内の対応するデータフィールド(
IDataField
)の存在を決定します。 定数はフィールド値を取得するために使用されます-メソッドはデータオブジェクトの基本インターフェイス(
IDataObject
インターフェイス)で宣言されます:
<T> IDataField<T> getDataField(FieldDeclaration<T> declaration) ;
次のように、
name
定数で表されるフィールドの値を取得できます。
Department d = ...;
IDataField<String> dataField = d.getDataField(Depatment.name);
String name = dataField.getValue();
または、ヘルパークラス
ModelUtil
短縮呼び出しを使用できます。
String name = ModelUtil.getValue(d, Depatment.name);
データオブジェクトのフィールドをJava Beanのプロパティと比較すると、 Java BeansテクノロジーはBeanインスタンスのプロパティを個別のオブジェクトに分離しません。つまり、Beanプロパティの値をラップしてBeanで「生きる」オブジェクトはありません 。 もちろん、そのようなオブジェクトは、プロパティの名前( Beanのインスタンス)のペアとして暗黙的に開発者の心の中に存在します 。 残念ながら、開発者の頭の中だけにそのようなオブジェクトが存在するため、コード内でオブジェクトを参照することはできません。
もちろん、開発者はカップルを表すクラスを簡単に作成できます
プロパティの名前は Beanのインスタンスですが、このようなクラスを使用すると、Beanのプロパティを削除したり、プロパティの名前を変更したりするコードで、アクションのコストが大幅に増加します。 コードでは、Beanプロパティを参照することはできません。その結果、このプロパティを削除または変更すると、コンパイル段階でリンクエラーが検出されます(実行段階でのみ可能) 。 この問題は、プロパティの名前を持つ文字列を使用することによってのみBeanプロパティを参照できるという事実によって引き起こされます(これはJavaの歴史的な配置です)。
一部の読者にとっては、フィールド値のオブジェクトラッパーの必要性を疑うときが来たと思います。 最も強力な議論の1つは、Java Beansと比較した場合のメモリ消費の増加です。 カウンターバランスは、情報の単位(フィールド値)の自己記述と表示の容易さであり、これにより、情報と対話するより再利用可能なコンポーネントを簡単に作成できます。
インスタンスを作成する前にデータオブジェクトのフィールドを参照する機能(つまり、説明付きの定数を参照する機能)を使用すると、コンパイルの段階でコード内のリンクの整合性を確認しながら、定数の宣言を使用して設定されるメカニズム全体を作成できます。
このようなメカニズムの好例は、Eclipse Data Modelユーザーインターフェイスプロジェクトfishbolt.org/eclipse/org.fishbolt.model.eclipse/doc/plugin.article.ru.htmlです。 このプロジェクトでは、データは宣言的な方法でユーザーインターフェイスコンポーネントに接続されます。