मैं कुछ इस तरह करना चाहता हूं:
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() );
इसलिए, मैं अपने एप्लिकेशन के ब्रह्मांड के सभी वर्गों को देखना चाहता हूं, और जब मुझे कोई ऐसा व्यक्ति मिलता है जो एनिमल से उतरता है, तो मैं उस प्रकार का एक नया ऑब्जेक्ट बनाना चाहता हूं और इसे सूची में जोड़ना चाहता हूं। यह मुझे चीजों की सूची को अपडेट किए बिना कार्यक्षमता जोड़ने की अनुमति देता है। मैं निम्नलिखित से बच सकता हूं:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
उपरोक्त दृष्टिकोण के साथ, मैं बस एक नया वर्ग बना सकता हूं जो एनिमल का विस्तार करता है और इसे स्वचालित रूप से उठाया जाएगा।
अद्यतन: 10/16/2008 9:00 प्रशांत मानक समय:
इस सवाल ने बहुत सारी शानदार प्रतिक्रियाएँ पैदा की हैं - धन्यवाद। प्रतिक्रियाओं और मेरे शोध से, मैंने पाया है कि जो मैं वास्तव में करना चाहता हूं वह सिर्फ जावा के तहत संभव नहीं है। ऐसे दृष्टिकोण हैं, जैसे कि ddimitrov के ServiceLoader तंत्र जो काम कर सकते हैं - लेकिन वे जो मैं चाहते हैं उसके लिए बहुत भारी हैं, और मुझे विश्वास है कि मैं समस्या को जावा कोड से बाहरी कॉन्फ़िगरेशन फ़ाइल में स्थानांतरित करता हूं। अपडेट 5/10/19 (11 साल बाद!) अब कई पुस्तकालय हैं जो @ इवानिक के उत्तर के अनुसार इस में मदद कर सकते हैं । org.reflections अच्छा लग रहा है। इसके अलावा @Luke Hutchison के जवाब से ClassGraph दिलचस्प लग रहा है। साथ ही उत्तरों में कई और संभावनाएँ हैं।
यह बताने का एक और तरीका कि मैं क्या चाहता हूं: मेरे एनिमल क्लास में एक स्थिर फ़ंक्शन उन सभी वर्गों को ढूंढता है, जो किसी भी और कॉन्फ़िगरेशन / कोडिंग के बिना - एनिमल से विरासत में प्राप्त करता है। अगर मुझे कॉन्फ़िगर करना है, तो मैं उन्हें जानवरों की कक्षा में वैसे भी तुरंत रोक सकता हूं। मैं समझता हूं कि क्योंकि जावा प्रोग्राम सिर्फ .class फ़ाइलों का एक ढीला फेडरेशन है जो कि बस उसी तरह है।
दिलचस्प है, ऐसा लगता है कि यह सी # में काफी तुच्छ है।