Böyle bir şey yapmak istiyorum:
List<Animal> animals = new ArrayList<Animal>();
for( Class c: list_of_all_classes_available_to_my_app() )
if (c is Animal)
animals.add( new c() );
Bu yüzden, uygulamamın evrenindeki tüm sınıflara bakmak istiyorum ve Animal'den inen bir tane bulduğumda, bu türden yeni bir nesne oluşturmak ve listeye eklemek istiyorum. Bu, bir şeyler listesini güncellemek zorunda kalmadan işlevsellik eklememe izin veriyor. Aşağıdakileri önleyebilirim:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
Yukarıdaki yaklaşımla, sadece Animal'i genişleten yeni bir sınıf oluşturabilirim ve otomatik olarak alınacaktır.
GÜNCELLEME: 10/16/2008 09:00 Pasifik Standart Saati:
Bu soru birçok harika yanıt verdi - teşekkürler. Yanıtlardan ve araştırmamdan, gerçekten yapmak istediğim şeyin Java altında mümkün olmadığını gördüm. Ddimitrov'un ServiceLoader mekanizması gibi çalışabilen yaklaşımlar var - ama istediğim şey için çok ağırlar ve problemi Java kodundan harici bir yapılandırma dosyasına taşıdığımı düşünüyorum. Güncelleme 5/10/19 (11 yıl sonra!) Yardımcı olacak birkaç kütüphaneler şimdi vardır IvanNik en @ göre bu cevabı org.reflections görünüyor iyi. Ayrıca ClassGraph @Luke Hutchison gelen cevap ilginç görünüyor. Cevaplarda da birkaç olasılık daha var.
Ne istediğimi belirtmenin başka bir yolu: Animal sınıfımdaki statik bir işlev, başka bir yapılandırma / kodlama yapmadan Animal'ten miras alan tüm sınıfları bulur ve başlatır. Yapılandırmam gerekirse, onları yine de Animal sınıfında somutlaştırabilirim. Bir Java programı sadece .class dosyalarının gevşek bir federasyon olduğu için anlıyorum.
İlginçtir, bu C # ' da oldukça önemsiz görünüyor .