次の問題に対する洗練された解決策を考えていて、頭が痛くなりました。親クラスといくつかのサブクラスがあります。親クラスはプロパティを取得するメソッドを宣言および実装していますが、プロパティ ファイルの名前はサブクラスによって決定されます。
私はサブクラスのインスタンスのみを扱っています。
メソッド (親で実装) はサブクラスのフィールド値を使用する必要がありますが、親クラスで使用しているため、そこでも宣言する必要があります。
これで、サブクラスからメソッドを呼び出すたびに、親クラスのフィールド値が使用されます。
私の問題を説明するためのいくつかの簡単なコード (覚えておいてください: 機能に関するものではなく、デザインに関するものです)。使用したいフィールド値を定義するサブクラス:
public class SubClass extends Parent {
public static final String CONFIG_FILE = "subclass.properties"; // same problem with non-static
public SubClass() {
System.out.println(getProperty("somekey"));
}
}
そして、使用したいメソッドを定義および実装する親クラス:
public class Parent {
public static final String CONFIG_FILE = "config.properties"; // same problem with non-static
public String getProperty(String key) {
Properties props = new Properties();
try {
props.load(new FileReader(new File(CONFIG_FILE)));
}
catch (IOException ioe) {
return null;
}
return props.get(key);
}
サブクラスから呼び出しgetProperty(..)
ているため、操作対象のインスタンスのフィールド値 (「subclass.properties」) を使用することを期待しますが、代わりに親フィールド値 (「config.properties」) を使用しています。非静的フィールドでも同じ効果が得られました。