Je me réfère à "framework fournisseur de services" comme discuté dans Chapter 2 of Effective Java, qui semble être exactement la bonne façon de gérer un problème que j'ai, où je dois instancier une de plusieurs classes à l'exécution, basé sur un String
pour sélectionner quel service , et un Configuration
objet (essentiellement un extrait XML):Simple Java "Service Provider frameworks"?
Mais comment obtenir les fournisseurs de services individuels (par exemple un groupe de fournisseurs par défaut + certains fournisseurs personnalisés) pour s'enregistrer?
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;
}
}
par exemple. Si j'écris des classes personnalisées MyFooAlgorithm et MyFooAlgorithmProvider pour implémenter FooAlgorithm et que je les distribue dans un fichier jar, existe-t-il un moyen d'appeler automatiquement registerProvider ou mes programmes clients qui utilisent l'algorithme doivent-ils appeler explicitement FooAlgorithmRegistry.registerProvider() pour chaque classe qu'ils veulent utiliser?
comme référence: ceci nécessite Java6 – dfa
+1 pour la référence du livre, merci –
intéressant: la réponse semble donc être qu'il existe un mécanisme de fichier JAR pour inclure les fichiers de configuration du fournisseur de service, + diverses classes/méthodes pour les instancier (par ex. java.util.ServiceLoader) –