効果的なJavaの第2章で説明されているように、「サービスプロバイダーフレームワーク」を参照しString
ます。これは、実行時にいくつかのクラスの1つをインスタンス化する必要がある、問題を処理するための正確な方法のようです。サービス、およびConfiguration
オブジェクト(基本的にはXMLスニペット):
しかし、どうすれば個々のサービスプロバイダー(たとえば、多数のデフォルトプロバイダーといくつかのカスタムプロバイダー)に自分自身を登録させることができますか?
interface FooAlgorithm
{
/* methods particular to this class of algorithms */
}
interface FooAlgorithmProvider
{
public FooAlgorithm getAlgorithm(Configuration c);
}
class FooAlgorithmRegistry
{
private FooAlgorithmRegistry() {}
static private final Map<String, FooAlgorithmProvider> directory =
new HashMap<String, FooAlgorithmProvider>();
static public FooAlgorithmProvider getProvider(String name)
{
return directory.get(serviceName);
}
static public boolean registerProvider(String name,
FooAlgorithmProvider provider)
{
if (directory.containsKey(name))
return false;
directory.put(name, provider);
return true;
}
}
たとえば、カスタムクラスMyFooAlgorithmとMyFooAlgorithmProviderを記述してFooAlgorithmを実装し、それらをjarに配布する場合、registerProviderを自動的に呼び出す方法はありますか、またはアルゴリズムを使用するクライアントプログラムはFooAlgorithmRegistry.registerProvider( )使用したいクラスごとに?