2015-05-30 15 views
5

Tôi cần một số lời khuyên về cách sử dụng Iterable<T> trong Java.Tôi có thực sự cần triển khai trình lặp trong trường hợp đó không?

Tôi có lớp sau:

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

tôi cần phải tạo ra một lớp ValidatorChain như sau:

public class ValidatorChain{ 
    //Contains Collection<Validator> 

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

Có lẽ tôi chỉ nên ghi đè một số thực hiện ngay lập tức các Iterable<T> thay vì viết một của riêng tôi từ đầu.

Trả lời

5

Bạn có thể viết nó bằng tay một cách đơn giản bằng cách ủy quyền cho bộ lặp của bộ sưu tập:

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

Nếu bạn cần sắp xếp, bạn có thể sắp xếp bộ sưu tập validators hoặc t ake một bản sao:

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

Hoặc với Java 8:

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

tránh thừa kế đôi khi nguy hiểm +1 – maskacovnik

+0

Làm cách nào để tôi có thể tôn trọng đơn đặt hàng? –

+0

validators.sort() ;, Phân loại tự nhiên với So sánh các loại bộ sưu tập như bạn mong đợi – maskacovnik

3

Bạn chỉ có thể kéo dài của bạn ValidatorChain với một bộ sưu tập:

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

Bây giờ nó là iterable, vì mở rộng ArrayList là iterable tự

+2

Tại sao mở rộng ArrayList nếu tất cả bạn cần là một cho mỗi vòng lặp? Thành phần trong trường hợp này có ý nghĩa hơn so với thừa kế ... – assylias

+2

Chỉ có một cho mỗi vòng lặp tôi đồng ý, nhưng cách tiếp cận này sẽ hữu ích trong tương lai mặc dù một số điều xấu nó mang lại. Và câu hỏi đặt ra là: "Tôi có thực sự cần" @assylias – maskacovnik

Các vấn đề liên quan