今回は物理量を観測するクラスを考えましょう。
必要なのは、物理量の名前(java.lang.String)、物理量の型(java.lang.Class<?>)、物理量を計算するメソッドです。 あと、観測対象となる物理系をフィールドとして保持するために、物理系に対するアクセッサ・メソッド*1も定義しておきましょう:
public interface Observable{ PhysicalSystem getPhysicalSystem(); void setPhysicalSystem(PhysicalSystem system); /** 物理量の名前 */ String getName(); /** 物理量の型 */ Class<?> getDatatype(); /** 物理量を観測するメソッド */ Object observe(); }
まぁ、上のような定義でもダメなわけではないんですが、
- 1つの観測量に対して1つのクラスを定義するのは結構手間
- 似たような量を計算する場合、1つのメソッド内で複数の物理量を計算できた方がパフォーマンス的にいい
ってことで、複数の観測量を1つのメソッド内で計算する ObservableSet と、観測データを保持しておく DataRegistry を以下のように定義します:
import java.util.List; public interface ObservableSet{ PhysicalSystem getPhysicalSystem(); void setPhysicalSystem(PhysicalSystem system); /** 物理量の名前の Set */ List<String> getDataEntries(); /** 引数の名前で指定される物理量の型 */ Class<?> getDatatype(String name); /** 物理量を観測するメソッド */ void observe(DataRegistry registry); }
public interface DataRegistry{ /** 引数で指定される観測量の値を返します。*/ Object getData(String name); /** 第1引数で指定される観測量の値を第2引数にセットします。 */ void setData(String name, Object value); /** セットされている観測データをリセットします。 */ void resetData(); }
ObservableSet の実装方法は、
- observe() メソッド内で物理量を計算する。
- メソッドの引数になっている DataRegistry オブジェクトに値をセットする。
という手順です。具体的な実装例はもう少し待ってくださいm(_ _)m
上記の Observable は、ObservableSet を実装する抽象クラスとして定義し直します(コードはここでは割愛)。
*1:getter/setter メソッド。