2015-05-30 12 views
5

Ho bisogno di qualche consiglio sull'uso di Iterable<T> in Java.Ho davvero bisogno di implementare iteratore in quel caso?

Ho la seguente classe:

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; 
    } 
} 

ho bisogno di creare una classe ValidatorChain come segue:

public class ValidatorChain{ 
    //Contains Collection<Validator> 

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

Forse dovrei ignorare qualche istante attuazione Iterable<T> invece di scrivere il mio uno da zero.

risposta

5

si può scrivere manualmente in modo semplice delegando ad iteratore della collezione:

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

Se avete bisogno allineati, è possibile ordinare le collezioni validators o t Ake una copia:

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

O con Java 8:

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

evitare l'ereditarietà a volte pericolosa +1 – maskacovnik

+0

Come posso rispettare l'ordine? –

+0

validators.sort() ;, ordinamento naturale con Ordina parcellizza la raccolta come previsto – maskacovnik

3

si può solo estende il vostro ValidatorChain con una collezione:

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

Ora è iterabile, a causa di ArrayList estendere quali è iterabile stesso

+2

Perché estendono arraylist se tutto ciò che serve è una per ogni ciclo? La composizione in questo caso ha più senso dell'ereditarietà ... – assylias

+2

Per uno solo per ogni anello sono d'accordo, ma questo approccio sarà utile in futuro, nonostante qualche cosa negativa che porta con. E una domanda era: "Ho davvero bisogno di" @assylias – maskacovnik

Problemi correlati