2010-11-01 15 views
37

मैं ओवर-राइडिंग हैशकोड की नमूना समस्या पर काम कर रहा हूं और विधि के बराबर है लेकिन त्रुटि प्राप्त कर रहा है: "कस्टमहैशकोडएक्स नमूना प्रकार का कोई भी संलग्न उदाहरण उपलब्ध नहीं है। कस्टमशैशकोडएक्स नमूना (उदाहरण के लिए एक संलग्न उदाहरण के साथ आवंटन को अर्हता प्राप्त करना चाहिए) ए() जहां x कस्टम हैशकोडएक्स नमूना का उदाहरण है) " मैंने एक आंतरिक वर्ग हैशपर्सन लिखा और मुझे यह त्रुटि मिल रही है जब मैं testHashCodeOverride() नामक किसी अन्य विधि में इस आंतरिक कक्षा को तुरंत चालू करने का प्रयास कर रहा हूं।आंतरिक कक्षा

public static void testHashCodeOverride(){ 
    System.out.println("\nTest HashCode Override Method"); 
    System.out.println("==================================\n"); 

    HashPerson william = new HashPerson("willy"); 
    HashPerson bill = new HashPerson("willy");   
} 

इस कोड को ठीक काम करता है, भले ही मैं स्थिर भीतरी वर्ग या बाहरी वर्ग के इन्स्टेन्शियशन देख न, उलझन :(

public class HashCodeExample { 

    public static void testHashCodeOverride() { 

     HashPerson william = new HashPerson("Willy"); 
     HashPerson bill = new HashPerson("Willy"); 
     System.out.println("Hash code for william = " + william.hashCode()); 
     System.out.println("Hash code for bill  = " + bill.hashCode()); 

     HashMap table = new HashMap(); 
     table.put(william, "Silly"); 

     if (table.containsKey(william)) { 
      System.out.println(table.get(william)); 
     } else { 
      System.out.println("Key " + william + " not found"); 
     } 

     if (table.containsKey(bill)) { 
      System.out.println(table.get(bill)); 
     } else { 
      System.out.println("Key " + bill + " not found"); 
     } 


    } 

    class HashPerson { 
     private static final int HASH_PRIME = 1000003; 

     public HashPerson(String name) { 
      this.name = name; 
     } 

     public String toString() { 
      return name; 
     } 

     public boolean equals(Object rhs) { 
      if (this == rhs) 
       return true; 

      // make sure they are the same class 
      if (rhs == null || rhs.getClass() != getClass()) 
       return false; 

      // ok, they are the same class. Cast rhs to HashPerson 
      HashPerson other = (HashPerson) rhs; 

      // our test for equality simply checks the name field 
      if (!name.equals(other.name)) { 
       return false; 
      } 

      // if we get this far, they are equal 
      return true; 
     } 
     public int hashCode() { 
      int result = 0; 
      result = HASH_PRIME * result + name.hashCode(); 
      return result; 
     } 
     private String name; 

    } 
} 
+1

क्या आपने वास्तव में त्रुटि संदेश पढ़ा था? यह आपको ** बिल्कुल ** बताता है कि क्या करना है। एक आंतरिक वर्ग को तुरंत चालू करते समय, इसे संलग्न कक्षा के उदाहरण के साथ योग्यता प्राप्त करनी चाहिए। –

+0

आपको वास्तव में उदाहरण कोड के स्वरूपण को साफ करना चाहिए और इसे आवश्यकतानुसार नीचे ले जाना चाहिए। अपने वर्तमान राज्य में यह काफी अपठनीय है। – MForster

+0

आप अपने 'hashCode' विधि को सरल बनाने के सिर्फ' name.hashCode वापस जाने के लिए कर सकते हैं(); ' –

उत्तर

106

मुझे लगता है कि आप HashPerson कक्षा static के रूप में घोषित करना चाहते हैं। अन्यथा यह केवल युक्त वर्ग के संदर्भ में, या तो युक्त वर्ग की एक विधि में या इस तरह कोड का उपयोग कर instantiated जा सकता है:

ContainingClass container = new ContainingClass(); 
HashPerson william = container.new HashPerson("willy"); 

वास्तव में, मेरा नियम-ऑफ-द अंगूठे किसी भी नेस्टेड वर्ग स्थिर बनाने के लिए है , जब तक कि मेरे पास कोई विशेष कारण न हो। यह भी अधिक कुशल है, क्योंकि गैर स्थैतिक घोंसला वाले वर्ग (आंतरिक वर्ग कहा जाता है) में हमेशा युक्त वस्तु का एक अंतर्निहित संदर्भ होता है।

+0

धन्यवाद एमफोर्स्टर, जिस स्थान पर मैं उलझन में हूं, मेरे पास एक नमूना कार्यक्रम है जो ठीक उसी तरह लिखा गया है जैसा मैं इसे यहां कर रहा हूं और उस कोड में, आंतरिक वर्ग स्थिर नहीं है और न ही वे कक्षा रखने का एक उदाहरण बना रहे हैं। क्या मुझे उस कोड में कुछ याद आ रही है? "मेरे प्रश्न में कोड संलग्न करना" – t0mcat

+0

क्या वे कक्षा के एक विधि के भीतर उदाहरण बना रहे हैं? – MForster

+0

शायद मैं कोड को सही ढंग से नहीं पढ़ रहा हूं। बस वास्तविक कोड पोस्ट किया। – t0mcat

7

आप या तो अपने भीतर के वर्ग स्थिर बनाने के लिए, या यह उल्लेख करने के लिए की जरूरत है बाहरी वर्ग का एक उदाहरण के माध्यम से। सबसे अधिक संभावना तुम सिर्फ अपने भीतर वर्ग स्थिर बनाना चाहते हैं।

एक वर्ग के गैर स्थिर सदस्य (चर, तरीकों, भीतरी वर्ग) उदाहरण वर्ग की प्रति कर रहे हैं। इसलिए, जब Acce एक स्थैतिक संदर्भ से गैर स्थैतिक सदस्यों को एसएसइंग (जैसे एक स्थिर विधि जैसे testHashCodeOverride), आपको संलग्न कक्षा का एक उदाहरण निर्दिष्ट करने की आवश्यकता है।

+0

हाय ओक्सेट , इसलिए ज्यादातर मामलों में हमें आंतरिक वर्ग स्थिर बनाना चाहिए? पसंदीदा तरीका क्या है? बाहरी वर्ग या स्थिर के उदाहरण के माध्यम से प्रवेश? – t0mcat

+0

सार्वजनिक एपीआई के लिए आंतरिक कक्षाओं का उपयोग न करें। आंतरिक कक्षाओं को बंद करने और अज्ञात वर्गों के लिए जोड़ा गया था। –

+0

डिफ़ॉल्ट रूप से, शीर्ष-स्तरीय कक्षाएं स्थैतिक हैं, लेकिन आंतरिक कक्षाएं गैर स्थैतिक हैं। यदि आप केवल कोड संगठन उद्देश्यों के लिए आंतरिक कक्षा बना रहे हैं, तो इसे 'स्थैतिक' बनाकर और एक स्टैंडअलोन क्लास (दृश्यता सीमित करने के विकल्प के साथ) का इलाज करना पसंद किया जाता है।यदि आपको अपनी कक्षा के गैर-स्थैतिक सदस्यों तक पहुंचने के लिए आंतरिक कक्षा की आवश्यकता है, तो आपको इसे गैर स्थैतिक बनाना चाहिए। – oksayt

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