2017-01-09 7 views
7

मेरे पास एक ऐसा कार्य है जिसे करने की आवश्यकता है लेकिन मैं वास्तव में अटक गया हूं।ऑब्जेक्ट्स बनाना एक इनपुट फ़ाइल

मूल रूप से, मैं इस तरह कुछ विरासत संबंधों है:

पशु

पालतू WildAnimal

बर्ड बिल्ली कुत्ता मछली || नाग ईगल

पशु पालतू और जंगली की मूल है जानवर। पालतू पक्षी, बिल्ली, कुत्ते, मछली का अभिभावक है। वाइल्डएनिमल सांप और ईगल के माता-पिता हैं।

कार्य चाहता है कि मैं एक फ़ाइल से इनपुट पढ़ूं जो "input.txt" है और पशु वस्तुओं को बनाते हैं।

"input.txt" की तरह है:

कीवी बर्ड चार्ली ईगल आम मछली काली मिर्च कुत्ते कोण बिल्ली ट्वीटी बर्ड बॉब कुत्ता ज़िगी नाग

मुझे इन नामों की सभी प्राप्त कर सकते हैं लेकिन मैं यह समझ नहीं पाया कि प्रत्येक नाम का प्रतिनिधित्व किस प्रकार की वस्तु का प्रतिनिधित्व करता है।

public static void main(String[] args) throws IOException { 
    String s =""; 
    int nameCounter = 0; 
    Animal[] animals = new Animal[100]; 

    try{ 
    Scanner input = new Scanner(Paths.get("input.txt")); 

     while (input.hasNext()) { 
      s = input.next(); 
      Animal animal = new Animal(s); 
      animals[nameCounter] = animal; 
      nameCounter += 2; 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

यहाँ पशु वर्ग है:

यहाँ मुख्य विधि है

public class Animal { 
private String name; 
private int numberOfLegs; 
private int numberOfWings; 

public Animal(String name){ 
    this.name = name; 
    numberOfLegs = 4; 
    numberOfWings = 0; 
} 

public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public int getNumberOfLegs() { 
    return numberOfLegs; 
} 
public void setNumberOfLegs(int numberOfLegs) { 
    this.numberOfLegs = numberOfLegs; 
} 
public int getNumberOfWings() { 
    return numberOfWings; 
} 
public void setNumberOfWings(int numberOfWings) { 
    this.numberOfWings = numberOfWings; 
} 
public void talk(){ 
    System.out.printf("<Silence>"); 
} 
public void fly(){ 
    System.out.printf("%s cannot fly", getName()); 
} 
public void run(){ 
    System.out.printf("%s is running", getName()); 
} 

}

अगर आप चाहते हैं मैं सभी अन्य वर्गों में जोड़ सकते हैं, लेकिन मैं नहीं है लगता है कि आपको उनकी आवश्यकता होगी।

+0

[यह] (http://stackoverflow.com/questions/1268817/create-new-class-from-a-variable-in-java) आपकी मदद कर सकता है। – Blobonat

+0

त्वरित स्वीकृति के लिए धन्यवाद! – GhostCat

उत्तर

4

आपको अपने विशिष्ट कक्षा की वस्तुओं को तुरंत चालू करना होगा; आने वाली स्ट्रिंग के आधार पर।

उदाहरण: यदि फ़ाइल का वर्ग नाम Bird है ... तो आपको किसी भी तरह new Bird() पर कॉल करना होगा।

वहाँ वहाँ पहुँचने के लिए दो तरीके हैं:

  1. प्रतिबिंब का उपयोग करना (आप वास्तव में कक्षाओं का दृष्टांत कर सकते हैं "स्ट्रिंग से", जानते हुए भी कि वर्ग के बारे में कुछ भी के बिना)
  2. एक स्विच बयान
  3. का उपयोग करके

Reflection एक "उन्नत" विषय (और गलत उपयोग करने में बहुत आसान) है; इसलिए मैं वास्तव में की तरह, विकल्प 2 के लिए जाने के लिए आप की सिफारिश करते हैं:

private Animal createAnimalFor(String className, String animalName) { 
    switch (className) { 
    case "Bird": return new Bird(animalName); 
    ... 
    default: throw new IllegalArgumentException("Dont know how to create object for unknown class: " + className); 
    } 
} 

(उपरोक्त कोड के रूप में "FYI" का मतलब है - मैं संकलक के माध्यम से यह नहीं चला है, यह आप एक देना करने के लिए है विचार यह कैसे किया जा सकता है)।

कि परे कुछ नोट:

  • अपने वस्तुओं के उन गुणों है कि नहीं बदल सकते हैं के लिए एक अंतिम क्षेत्र का उपयोग पर विचार करें। उस नाम के लिए आपको सेटर की आवश्यकता नहीं है; बस कन्स्ट्रक्टर को पैरामीटर के रूप में नाम दें। दूसरे शब्दों में: केवल उन क्षेत्रों को "बदलने योग्य" बनाएं जो समझने के लिए समझ में आ जाए। कुछ और बेहतर होना चाहिए अंतिम
  • 100 खाली स्लॉट के साथ एक सरणी का उपयोग करने के बजाय, आप java.util.ArrayList का उपयोग कर सकते हैं और बस उस फ़ाइल में जितने नए जानवरों को जोड़ सकते हैं।
  • अपने पशु वर्ग के बराबर/हैशकोड विधियों को जोड़ने पर विचार करें (अनिवार्य नहीं है, लेकिन आपको क्यों पढ़ना चाहिए जो अक्सर समझ में आता है)।
  • शायद सबसे महत्वपूर्ण बात: पर विचार करें उन सभी अलग-अलग विधियों को सीधे अपनी बेस क्लास में डालें। यह या तो अमूर्त सबक्लास बनाने के लिए और अधिक समझ सकता है जो कुछ फ़ंक्शंस जोड़ता है, या इंटरफेस का उपयोग करता है, जैसे interface FlyingAnymal { void fly() }; जो आपके विशिष्ट सबक्लास लागू होते हैं। आपकी बेस क्लास पर बहुत सी विधियां डालने के लिए वास्तव में अच्छा अभ्यास नहीं है ... जो उप-वर्गों के सभी के लिए समझ में नहीं आता है।
+0

मैंने प्रतिबिंब के बारे में सुना लेकिन मुझे विचार नहीं मिला। दूसरी ओर स्विच निश्चित रूप से कुछ है जो मैं अभी कर सकता हूं। बहुत बहुत धन्यवाद। –

+1

Fyi: मैंने आपकी परियोजना के लिए कुछ और नोट/सामान्य संकेत जोड़े। मुझे उम्मीद है कि यह मदद करता है ;-) – GhostCat

3

तुम सच में प्रतिबिंब का उपयोग करें ताकि (जो मैं भी हतोत्साहित होगा) क्या करना चाहते हैं, तो यहाँ नमूना कोड:

String name = input.next(); 
String className = input.next(); 
// apply transformations to className as needed 
Class<Animal> c = (Class<Animal>) Class.forName(className); 
Constructor<Animal> constr = c.getDeclaredConstructor(String.class); // retrieves the Animal(String name) constructor 
Animal a = constr.newInstance(name); 

मुझे नहीं लगता कि कोड इतना जटिल है, लेकिन कुछ लोगों को है कभी भी प्रतिबिंब का उपयोग किया जाता है, इसलिए उन्हें इसे बनाए रखने में समस्याएं आती हैं, और यह आपकी कक्षा परिभाषाओं के साथ कसकर मिलती है, इसलिए इसे शायद बहुत ही बनाए रखा जाना चाहिए।

+0

अच्छा, यह उचित लगता है। मैं निश्चित रूप से भी कोशिश करूँगा। –

संबंधित मुद्दे