2011-06-29 11 views
5

मुझे कुछ समझने में कोई समस्या है - मैं इस बारे में पूरी तरह से गलत हो रहा हूं।विस्तारित ऐरेलिस्ट और नई विधियां बनाना

मैं एक वर्ग जो ArrayList फैली लेकिन कई तरीके है जिसके कार्यक्षमता में वृद्धि है बनाने के लिए कोशिश कर रहा हूँ (कम से कम कार्यक्रम मैं विकासशील रहा।)

तरीकों में से एक है एक findById (पूर्णांक आईडी) है, जो किसी विशेष आईडी मिलान के लिए प्रत्येक ArrayList ऑब्जेक्ट की खोज करता है। अब तक यह काम कर रहा है, लेकिन यह मुझे for (Item i : this) { i.getId(); }

मुझे समझ में नहीं आता क्यों?

पूर्ण कोड:

public class CustomArrayList<Item> extends ArrayList<Item> { 

    // declare singleton instance 
    protected static CustomArrayList instance; 

    // private constructor 
    private CustomArrayList(){ 
     // do nothing 
    } 

    // get instance of class - singleton 
    public static CustomArrayList getInstance(){ 
     if (instance == null){ 
      instance = new CustomArrayList(); 
     } 
     return instance; 
    } 

    public Item findById(int id){ 
     Item item = null; 
     for (Item i : this) { 
      if (i.getId() == id) { 
         // something 
     } 
     } 
     return item; 
    } 
    public void printList(){ 
     String print = ""; 
     for (Item i : this) { 
      print += i.toString() + "\n"; 
     } 
     System.out.println(print); 
    } 
} 

उत्तर

7

बदलें

public class CustomArrayList<Item> extends ArrayList<Item> { 

को

public class CustomArrayList extends ArrayList<Item> { 

मैं Item संदेह क्लास का नाम है कि आप सूची में संग्रहीत करना चाहते हैं है । CustomArrayList के बाद <Item> जोड़कर आप टाइप पैरामीटर पेश कर रहे हैं जो इस कक्षा को छाया करता है।


<Item> पैरामीटर के साथ, अपने कोड,

public class CustomArrayList<T> extends ArrayList<T> { 
    // ... 
     for (T i : this) { i.getId(); } 
    // ... 
} 

जो स्पष्ट रूप से हमेशा काम नहीं करेगा के बराबर है के रूप में T किसी भी प्रकार का उल्लेख कर सकते।

+0

बहुत बढ़िया से अधिक रचना पसंद करते हैं। क्या यह सिर्फ उचित वाक्यविन्यास है, या मैं कुछ और करने की कोशिश कर रहा था? आपको बहुत - बहुत धन्यवाद! जल्दी जवाब दो। – Cody

+1

शायद यह आपके परिदृश्य के लिए उचित वाक्यविन्यास है। क्यों बताने के लिए जवाब अद्यतन किया। – aioobe

+1

धन्यवाद! यह बहुत अच्छी तरह से बताता है। – Cody

2

getId() क्या है? संभवतः यह में कुछ वर्ग में एक विधि है, लेकिन हम नहीं जानते हैं जो कक्षा है।

यदि आपको वास्तव में Item नामक एक कक्षा मिली है, तो getId() विधि के साथ, जिसे यह एक सूची माना जाता है, आपको बस अपनी कक्षा को सामान्य होने से रोकने की आवश्यकता है। तो यह करने के बजाय:

public class CustomArrayList<Item> extends ArrayList<Item> { 

आप चाहते हैं:

public class CustomArrayList extends ArrayList<Item> { 
वर्तमान में अपने वर्ग के भीतर

, Item एक वर्ग कहा जाता है मद का उल्लेख नहीं करता है, यह एक प्रकार पैरामीटरItem कहा जाता है को संदर्भित करता है।

अब व्यक्तिगत रूप से:

  • मैं एकमात्र बनाने से बचना नहीं होगा जब तक आप वास्तव में
  • करने के लिए है आप के लिए, मैं (वैसे आप में उन्हें बनाने जो थ्रेड नहीं है से बचने चाहते हैं तो -सुरक्षित)
  • मैं ArrayList<> का विस्तार नहीं होगा जब तक मैं वास्तव में किया था, विरासत
+0

मैं इस कारण के लिए एक सिंगलटन बना रहा हूं कि मेरे पास केवल एक ही हो। मुझे पता है कि जिस तरह से मैं इसे बना रहा हूं वह थ्रेड सुरक्षित नहीं है - मुझे "लॉक विधि" की आवश्यकता होगी, सही? क्या एओबोब ने मेरी समस्या हल की है, लेकिन मुझे अभी भी थ्रेड-सुरक्षित सिंगलटन बनाने में दिलचस्पी है। – Cody

+1

जावा 1.5+ में सिंगलटन बनाने का पसंदीदा तरीका एनम का उपयोग करना है। उदाहरण के लिए यह प्रश्न देखें: http://stackoverflow.com/questions/70689/ कुशल-way-to-implement-singleton-pattern-in-java – aioobe

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