Je veux faire quelque chose comme ceci:
List<Animal> animals = new ArrayList<Animal>();
for( Class c: list_of_all_classes_available_to_my_app() )
if (c is Anamal)
animals.add( new c() );
Donc, je tiens à regarder toutes les classes dans mon application de l'univers, et quand j'en trouve un qui descend de l'Animal, je veux créer un nouvel objet de ce type et l'ajouter à la liste. Cela me permet d'ajouter des fonctionnalités sans avoir à mettre à jour une liste de choses. Je ne peux éviter le suivant:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
Avec l'approche ci-dessus, je peux tout simplement créer une nouvelle classe qui étend la classe des Animaux, et il va aller chercher automatiquement.
Mise à JOUR: 10/16/2008 9:00 h, Heure normale du Pacifique:
Cette question a généré beaucoup de réponses, merci à vous. À partir des réponses et mes recherches, j'ai trouvé que ce que je veux vraiment faire, c'est juste pas possible en Java. Il existe des approches, telles que ddimitrov de ServiceLoader mécanisme de travail-mais ils sont très lourd pour ce que je veux, et je crois que j'ai tout simplement déplacer le problème à partir du code Java à un fichier de configuration externe.
Une autre manière de formuler ce que je veux: une fonction statique à mon Animal de la classe de découvertes et de instancie toutes les classes qui héritent de l'Animal, sans autre configuration de codage. Si je dois configurer, je pourrais tout aussi bien les instancier dans l'Animal de la classe de toute façon. Je comprends que le fait qu'un programme Java est juste une fédération lâche .les fichiers de classe que c'est juste la façon dont il est.
Fait intéressant, il semble que ce soit assez banale en C#.