2012-04-09 20 views
5

Giả sử rằng tôi có một cấu trúc List<Person> all dữ liệu, nơi Person được định nghĩa là:mẫu java để duy trì ổn định các chỉ số trên dữ liệu trong bộ sưu tập

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

Tôi muốn mantain một dư thừa List<Person> drivers chỉ chứa những người mà có giấy phép lái xe hợp lệ. Tôi nghĩ rằng nó cũng có thể được xem như là một chỉ số (cũng là một chỉ mục sẽ chứa tất cả các mục, nhưng mục đích là rất tương tự).
Điều này là để tránh sự cần thiết phải lặp qua toàn bộ danh sách mỗi lần tôi cần những dữ liệu đó.
(Looping mỗi lần có lợi thế là tôi có một đại diện độc quyền của thông tin hasValidDrivingLicense của tôi, bỏ qua con đường này đòi hỏi: a) lý do hợp lệ b) thử nghiệm thay thế. Những lý do phụ thuộc vào vấn đề cụ thể; sự lựa chọn là những gì tôi đang phát triển ở đây :-))
vấn đề
tôi có lẽ có một cái gì đó như thế này:

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

này thường hoạt động.

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

Ở đây không. Vì vậy, vấn đề là: thông tin dư thừa có thể sai lệch. Các chỉ mục có thể "vỡ".

giải pháp

  1. tài sản hasValidDrivingLicense Person của thực hiện mẫu thiết kế Quan sát (hoặc publish-thuê bao, những gì trong xoay được dựa trên giao diện Listener) Nếu đối tượng có thể thay đổi và tôi muốn chỉ số của tôi để thể lên -to-date với những thay đổi của họ, tôi cần một cách để thông báo cho chỉ mục-mantainer rằng một đối tượng đã thay đổi một tài sản có liên quan. Quan sát có vẻ là một giải pháp dứt khoát. Không có câu hỏi về nó.
  2. Person là bất biến

Vấn đề

Bất Biến có vẻ là một giải pháp khả thi, nhưng, từ điểm thu duy trì quan điểm, đó là người viết mã:

public void add(Person p) { 
    ... 
} 

phải đảm bảo rằng p không thay đổi hoặc tốt hơn, ít nhất là hasValidDrivingLicense là cuối cùng.

a) điều này có thể được thực hiện thông qua phản ánh (http://stackoverflow.com/questions/203475/how-do-i-identify-immutable-objects-in-java) Nhưng điều này không yêu cầu đánh giá hiệu suất? Không phản ánh đi kèm với chi phí?

b) ở đó, có lẽ trong các mẫu thiết kế hoặc trong các tính năng mới của ngôn ngữ (ví dụ: thuyết minh) các giải pháp khác cho vấn đề này?

+0

@Louis Wasserman đây là điều tốt nhất của tôi. tôi nghĩ rằng các câu hỏi thiết kế khó khăn hơn nhiều so với các vấn đề thực tế. Tuy nhiên, khi tôi nghĩ rằng một câu hỏi thiết kế là rất quan trọng, tôi cố gắng để đặt xuống với một ví dụ đơn giản. Ở đây tôi quan tâm KHÔNG trong các bộ sưu tập được xếp hàng, làm thế nào họ có thể nếu trình điều khiển không chứa tất cả các elemnents của 'tất cả'? có thể họ có thể có cùng thứ tự ... nhưng đây không phải là yêu cầu. yêu cầu là một thực tế: làm thế nào để đảm bảo tính nhất quán. việc thay đổi trạng thái mục có thể phá vỡ sự nhất quán. giữa chỉ mục một dữ liệu thực tế. – AgostinoX

+0

Tôi khuyên bạn nên xem lại gói danh sách duy nhất và tạo danh sách phụ theo yêu cầu. – samlewis

Trả lời

2

Tôi đoán những gì bạn muốn là chế độ xem được lọc trực tiếp của bộ sưu tập tất cả.

Điều này có thể được thực hiện khá độc đáo với Google ổi và một Predicate:

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

Mặt khác, chỉ cần thực hiện một danh sách personsWithDriversLicens() {...} cũng rất dễ dàng, vì vậy có lẽ Ổi là quá mức cần thiết - tùy thuộc vào nhu cầu của bạn, bao gồm các đặc tính hiệu suất.

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