2012-04-09 9 views
5

मान लीजिए मैं एक List<Person> all डेटा संरचना, जहां Person परिभाषित किया गया है, जिन्हें इस:जावा पैटर्न एक संग्रह में लगातार बनाए रखने के लिए डेटा पर अनुक्रमित

class Person { 
    String firstName; 
    String secondName; 
    boolean hasValidDrivingLicense; 
} 

मैं एक निरर्थक List<Person> drivers है कि केवल व्यक्तियों में शामिल है mantain करना चाहते हैं कि एक वैध ड्राइविंग लाइसेंस है। मुझे लगता है कि इसे एक इंडेक्स के रूप में भी देखा जा सकता है (अच्छी तरह से एक सूचकांक में सभी आइटम होंगे, लेकिन उद्देश्य बहुत समान है)।
यह हर बार मुझे उन डेटा की आवश्यकता होने पर पूरी सूची के माध्यम से लूपिंग की आवश्यकता से बचने के लिए है।
(प्रत्येक बार लूपिंग का लाभ यह है कि मेरे पास एक हैडलिड ड्राइविंग लाइसेंस जानकारी का एकल-आधिकारिक-प्रतिनिधित्व है; इस सड़क को त्यागने के लिए आवश्यक है: ए) मान्य कारण बी) परीक्षण वैकल्पिक। कारण विशिष्ट समस्या पर निर्भर करते हैं;

void add(Person p) { 
    all.add(p); 
    if (p.hasValidDrivingLicense()) { 
     drivers.add(p); 
    } 
} 

इस बार काम करता है: विकल्प मैं यहाँ क्या कर रहा हूँ विकासशील :-))
समस्या कुछ इस तरह
मैं शायद नहीं है।

Person p = new Person(); //then set fields, of course. 
add(p); 
p.setHasValidDrivingLicense(true); 

यहाँ ऐसा नहीं है। तो समस्या यह है: अनावश्यक जानकारी गलत तरीके से हो सकती है। इंडेक्स "टूटा" हो सकता है।

समाधान

  1. व्यक्ति की hasValidDrivingLicense संपत्ति प्रत्यक्ष डिज़ाइन पैटर्न को लागू (या प्रकाशित-ग्राहक, जोरों पर क्या श्रोता इंटरफेस पर आधारित है) वस्तुओं बदल सकते हैं और मैं अपने अनुक्रमित ऊपर होना चाहते हैं कर सकते हैं उनके परिवर्तनों के साथ-साथ, मुझे इंडेक्स-मैनेटेनर को सूचित करने का एक तरीका चाहिए कि किसी ऑब्जेक्ट ने प्रासंगिक प्रॉपर्टी बदल दी हो। अवलोकन एक निश्चित समाधान प्रतीत होता है। इसके बारे में कोई सवाल नहीं है।

    public void add(Person p) { 
        ... 
    } 
    
    :
  2. व्यक्ति अपरिवर्तनीय

समस्या

अचल स्थिति एक व्यवहार्य समाधान लगता है, लेकिन देखने का संग्रह मेंटेनर बिंदु से, कि जो व्यक्ति कोड लिखता है

यह सुनिश्चित करना है कि पी अपरिवर्तनीय या बेहतर है, कम से कम ValidDrivingLicense अंतिम है।

ए) यह प्रतिबिंब (http://stackoverflow.com/questions/203475/how-do-i-identify-immutable-objects-in-java) के माध्यम से किया जा सकता है लेकिन क्या इसे एक नई आवश्यकता नहीं है निष्पादन मूल्यांकन? प्रतिबिंब एक लागत पर नहीं आता है?

बी) शायद डिजाइन पैटर्न में या भाषा की नई विशेषताओं (उदा। टिप्पणियां) में इस समस्या के अन्य समाधान हैं?

+0

@ लुइस वासरमैन यह मेरा सबसे अच्छा है। मुझे लगता है कि प्रैक्टिकल मुद्दों की तुलना में डिजाइन प्रश्नों को रखना मुश्किल है। फिर भी, जब मुझे लगता है कि एक डिजाइन सवाल बहुत महत्वपूर्ण है, तो मैं एक साधारण उदाहरण के साथ डालने की कोशिश करता हूं। यहां मुझे दिलचस्पी रखने के लिए संग्रह में दिलचस्पी नहीं है, अगर ड्राइवरों में 'सभी' के सभी गलतियों को शामिल नहीं किया जा सकता है तो वे कैसे हो सकते हैं? संभवतः उनके पास एक ही आदेश हो सकता है ... लेकिन यह कोई अनुरोध नहीं है। अनुरोध वास्तविक है: निरंतरता सुनिश्चित करने के लिए कैसे। एक आइटम स्थिति बदलना स्थिरता तोड़ सकता है। सूचकांक के बीच एक वास्तविक डेटा। – AgostinoX

+0

मैं एकल सूची योजना का पुनरीक्षण करने और आवश्यकतानुसार उप सूची बनाने का सुझाव देता हूं। – samlewis

उत्तर

2

मुझे लगता है कि क्या आप चाहते हैं एक "लाइव" फ़िल्टर्ड अपने सभी संग्रह का दृश्य है।

यह गूगल अमरूद और एक विधेय के साथ काफी अच्छी तरह से किया जा सकता है:

http://docs.guava-libraries.googlecode.com/git-history/v11.0.2/javadoc/com/google/common/collect/Collections2.html#filter%28java.util.Collection,%20com.google.common.base.Predicate%29

दूसरी ओर, सिर्फ एक सूची personsWithDriversLicens() {...} भी आसान है, तो शायद अमरूद है को लागू करने ओवरकिल है - प्रदर्शन विशेषताओं सहित आपकी आवश्यकताओं पर निर्भर करता है।

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