2015-05-22 5 views
11

मैं तीन वर्गों (संख्या शायद भविष्य में बढ़ने किया जाएगा) है यह तथ्य था कि मैं नहीं चाहता कि कोई भी सूचक को Base पर पॉइंटर के माध्यम से जोड़ देगा। मेरी ठोस स्थिति में यह असुरक्षित होगा।अधिभावी सूची और जावा अभ्यास

लेकिन नुकसान यह है कि यह केवल रनटाइम पर ही खोजा जाएगा।

मुझे सूची में फिर से प्रयास करने की भी आवश्यकता है।

क्या ऐसी चीजों को करने का अच्छा अभ्यास है?

+6

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

+3

@duffymo शायद आप उन चीज़ों को समझने के लिए एक उदाहरण दे सकते हैं जिनके बारे में आप बात कर रहे हैं? –

+0

"संरचना" का मतलब है 'ऐरेलिस्ट' को 'ऐरेलिस्ट' को विस्तारित करने के बजाय एक क्षेत्र के रूप में। (उदाहरण कोड के लिए मेरे या सदस्यों के जवाब देखें।) – aioobe

उत्तर

12

interface का उपयोग करना ठीक है। (एक अमूर्त वर्ग में Base टर्निंग आप कुछ भी यहाँ खरीद लेंगे नहीं।)

आप हालांकि विरासत यहाँ पर रचना के पक्ष में करना चाहिए, और लागू Iterable<Base> छोरों आदि

class BaseList implements Iterable<Base> { 
    private List<Base> list = new ArrayList<>(); 

    public boolean add(Select s) { 
     return list.add(s); 
    } 

    public boolean add(Ast a) { 
     return list.add(a); 
    } 

    public boolean add(Gt gt) { 
     return list.add(gt); 
    } 

    @Override 
    public Iterator<Base> iterator() { 
     return Collections.unmodifiableList(list).iterator(); 
    } 
} 
के लिए बढ़ाया में इसका इस्तेमाल करने में सक्षम हो

फिर आप निम्नानुसार सूची में पुन: प्रयास कर सकते हैं:

for (Base b : yourBaseList) { 
    ... 
} 
+0

'collects.unmodifiableList (list) .iterator()' का उपयोग करके इस इटरेटर को केवल ट्रैवर्सिंग उद्देश्य के लिए प्रतिबंधित करें। इसकी आवश्यकता क्यों होनी चाहिए? यह 'इटरेटर' की शक्ति और लाभ को कम करने के लिए अनावश्यक प्रतिबंध की तरह लगता है। – TheCurious

+0

@ dubey-theHarcortians, यह डिज़ाइन की बात है, और यह जरूरी नहीं है कि यह सही काम है। हालांकि यह encapsulation बढ़ता है, तो यह यहाँ करने के लिए रक्षात्मक बात है। यदि ओपी उदाहरण के लिए 'बेसलिस्ट' में 'निकालें' विधि जोड़ना चुनता है, तो 'unmodifiableList' निश्चित रूप से गिरा दिया जाना चाहिए। – aioobe

7

आप Baseabstract कक्षा बना सकते हैं, क्योंकि इन्हें कभी भी तत्काल नहीं किया जा सकता है, आपकी सूची सुरक्षित होगी।

मेरा तरीका: मैं वास्तव में समझ नहीं पा रहा हूं कि आप add(Base b) के लिए अपवाद क्यों फेंकना चाहते हैं जब आधार interface है जो स्वयं कभी ऑब्जेक्ट नहीं हो सकता है।

अन्यथा, प्रतिनिधि/रैपर पैटर्न का उपयोग करें, इसका मतलब है: ArrayList का विस्तार न करें, लेकिन एक एररेलिस्ट धारण करें।

class BaseList { 
    private List<Base> list = new ArrayList<>(); 

    public boolean add(Select s) { 
     return list.add(s); 
    } 
    //etc 
} 
+0

पुन: पहला बिंदु, आप अभी भी एक उपclass को चालू कर सकते हैं, लेकिन 'बेस' प्रकार का संदर्भ है। प्रतिनिधि का उपयोग - ठीक है, अच्छा सुझाव। – vikingsteve

+2

मुझे नहीं लगता कि 'बेस' को एक अमूर्त वर्ग बनाने में कोई फर्क नहीं पड़ता। तत्कालता के संबंध में एक ही नियम इंटरफेस पर भी लागू होता है। – aioobe

+0

लेकिन मैं बेसलिस्ट पर फ़ोरैच लूप के साथ फिर से सक्रिय नहीं हो पाऊंगा। यह बहुत अच्छा नहीं है। –

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