2015-05-30 10 views
5

मुझे जावा में Iterable<T> के उपयोग के बारे में कुछ सलाह चाहिए। मैं एक वर्ग ValidatorChain बनाने की आवश्यकता के रूप में इसक्या मुझे वास्तव में उस मामले में पुनरावर्तक को लागू करने की आवश्यकता है?

public abstract class Validator implements Comparable<Validator>{ 
    public abstract boolean validate(); 
    public abstract int getPriority(); 

    @Override 
    public int compareTo(Validator o) { 
     return getPriority() > o.getPriority() ? -1 : 
       getPriority() == o.getPriority() ? 0 : 
        1; 
    } 
} 

:

public class ValidatorChain{ 
    //Contains Collection<Validator> 

    // and we can iterate over it with for-each loop in high-to-low priority order 
} 

हो सकता है कि मैं सिर्फ Iterable<T> के कुछ पल कार्यान्वयन ओवरराइड करना चाहिए बजाय अपने ही एक लेखन

मैं निम्नलिखित वर्ग है शुरुवात से।

उत्तर

5

आप इसे मैन्युअल रूप से एक सरल तरीके से करने के लिए सौंपने से लिख सकते हैं की वजह से iterable है, संग्रह के इटरेटर:

public class ValidatorChain implements Iterable<Validator> { 
    Collection<Validator> validators = ...; 
    public Iterator<Validator> iterator() { 
    return validators.iterator(); 
    } 
} 

आप की जरूरत है यह हल कर, आप या तो validators संग्रह या टी सॉर्ट कर सकते हैं शॉट लें एक प्रति:

public Iterator<Validator> iterator() { 
    List<Validator> sorted = new ArrayList<> (validators); 
    Collections.sort(sorted); 
    return sorted.iterator(); 
    } 

या जावा 8 के साथ:

public Iterator<Validator> iterator() { 
    return validators.stream().sorted().collect(toList()).iterator(); 
    } 
+0

कभी-कभी खतरनाक विरासत से बचने के लिए +1 – maskacovnik

+0

मैं आदेश का सम्मान कैसे कर सकता हूं? –

+0

validators.sort() ;, तुलनात्मक रूप से तुलनात्मक रूप से प्राकृतिक सॉर्टिंग संग्रह की तरह – maskacovnik

3

आप केवल फैली कर सकते हैं अपने ValidatorChain संग्रह के साथ:

public class ValidatorChain extends ArrayList<Validator>{ 
    //... 
} 

अब यह विस्तार ArrayList जो iterable ही

+2

क्यों ArrayList का विस्तार करता है, तो आप सभी की जरूरत प्रत्येक पाश के लिए एक है? इस मामले में संरचना विरासत से अधिक समझ में आता है ... – assylias

+2

प्रत्येक लूप के लिए केवल एक के लिए मैं सहमत हूं, लेकिन यह दृष्टिकोण कुछ बुरी चीजों के बावजूद भविष्य में उपयोगी होगा। और एक सवाल यह था: "क्या मुझे वास्तव में आवश्यकता है" @assylias – maskacovnik

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

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