2015-05-30 17 views
5

Ich brauche einen Rat zur Verwendung von Iterable<T> in Java.Muss ich in diesem Fall wirklich einen Iterator implementieren?

Ich habe die folgende Klasse:

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

Ich brauche ValidatorChain eine Klasse zu erstellen, wie folgt:

public class ValidatorChain{ 
    //Contains Collection<Validator> 

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

Vielleicht sollte ich nur einige sofortige Umsetzung von Iterable<T> außer Kraft setzen, anstatt meinen eigenen zu schreiben von Grund auf neu.

Antwort

5

Sie es manuell auf einfache Art und Weise schreiben können durch Delegieren Iterator Sammlung:

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

Wenn Sie es sortiert, können Sie entweder sortieren die validators Sammlungen oder t ake eine Kopie:

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

Oder mit Java 8:

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

vermeiden manchmal gefährliche Erbschaft +1 – maskacovnik

+0

Wie kann ich die Bestellung respektieren? –

+0

validators.sort() ;, Natürliche Sortierung mit Vergleichbaren Sortierungen die Sammlung wie Sie erwarten – maskacovnik

3

Sie können nur erweitert Ihr ValidatorChain mit einer Sammlung:

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

Nun ist es iterable, weil die Verlängerung Arraylist, die iterable selbst

+2

Warum Arraylist verlängern, wenn alles, was Sie brauchen, ist ein für jede Schleife ist? Komposition in diesem Fall macht mehr Sinn als Vererbung ... – assylias

+2

Für nur einen für jede Schleife stimme ich zu, aber dieser Ansatz wird in der Zukunft nützlich sein, trotz einiger schlechter Dinge, die er mit sich bringt. Und eine Frage war: "Muss ich wirklich" @assylias – maskacovnik

Verwandte Themen