Я хочу зробити щось подібне:
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() );
Отже, я хочу переглянути всі класи у Всесвіті моєї програми, і коли я знайду такий, який походить від Animal, я хочу створити новий об’єкт цього типу та додати його до списку. Це дозволяє мені додавати функціональність без необхідності оновлювати список речей. Я можу уникати наступного:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
З вищенаведеним підходом я можу просто створити новий клас, який розширює Animal, і він автоматично підбиратиметься.
ОНОВЛЕННЯ: 16.10.2008 9:00 за тихоокеанським стандартним часом:
Це питання породило багато чудових відповідей - дякую. З відповідей та моїх досліджень я з’ясував, що те, що я дійсно хочу зробити, просто не можливо під Java. Є такі підходи, як механізм ServiceLoader ddimitrov, який може працювати - але вони дуже важкі для того, що я хочу, і я вважаю, що я просто переміщу проблему з коду Java у зовнішній файл конфігурації. Оновлення 5/10/19 (11 років по тому!) Є тепер кілька бібліотек , які можуть допомогти з цим в відповідно до @ IvanNik в відповідь org.reflections виглядає добре. Також ClassGraph від @Luke Хатчінсон відповіді виглядає цікаво. Є ще кілька можливостей у відповідях.
Ще один спосіб заявити, що я хочу: статична функція в моєму класі Animal знаходить і створює всі класи, які успадковуються від Animal - без додаткової конфігурації / кодування. Якщо мені доведеться конфігурувати, я все-таки міг би просто заповнити їх у класі Animal. Я розумію, що програма Java - це просто вільна федерація файлів .class, що це саме так.
Цікаво, що здається, що це досить тривіально в C #.