2012-04-09 7 views
5

Załóżmy, że mam strukturę List<Person> all danych, gdzie Person jest zdefiniowany jako:wzory Java, aby utrzymać spójne indeksów na danych w kolekcji

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

Chcę mantain redundantny List<Person> drivers że zawiera tylko osoby, które mieć ważne prawo jazdy. Myślę, że można go również postrzegać jako indeks (dobrze, że indeks zawierałby wszystkie pozycje, ale cel jest bardzo podobny).
Ma to na celu uniknięcie potrzeby zapętlenia całej listy za każdym razem, gdy potrzebuję tych danych.
(Zapętlenie za każdym razem ma tę zaletę, że mam jedną autorytatywną reprezentację moich informacji o hasvalidDrivingLicense, porzucenie tej drogi wymaga: a) ważnych powodów b) sprawdzonej alternatywy. Przyczyny zależą od konkretnego problemu; alternatywą jest co Zajmuję tutaj :-))
problemu nie
pewnie coś takiego:

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

to często działa.

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

Tutaj nie ma. Problem polega na tym, że nadmiarowe informacje mogą się źle ustawić. Indeksy mogą "zepsuć się".

rozwiązania

  1. nieruchomość hasValidDrivingLicense osoby wdrożyć obserwowalnych wzorca projektowego (lub Publish-abonenta, co w swing jest oparty na interfejsie Listener) Jeśli obiekty mogą zmienić i chcę moje indeksy zmajstrować -do-daty z ich zmianami, potrzebuję sposobu na powiadomienie indeksu-mantainer, że obiekt zmienił odpowiednią właściwość. Obserwowalne wydaje się być ostatecznym rozwiązaniem. Bez żadnych pytań.
  2. Osoba jest niezmienna

Problem

Niezmienność wydaje się być dobrym rozwiązaniem, ale z punktu kolekcja opiekunach widzenia, że ​​jest osoba, która pisze kod:

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

musi zapewnić, że p jest niezmienne lub lepsze, co najmniej hasValidDrivingLicense jest ostateczne.

a) można tego dokonać za pomocą refleksji (http://stackoverflow.com/questions/203475/how-do-i-identify-immutable-objects-in-java) Ale czy nie wymaga to nowego ocena wydajności? Czy odbicie nie wiąże się z kosztami?

b) czy istnieją, być może, wzorce projektowe lub nowe cechy języka (np. Negocjacje), inne rozwiązania tego problemu?

+0

@Louis Wasserman to jest moje najlepsze. Myślę, że pytania projektowe są trudniejsze do postawienia niż kwestie praktyczne. Niemniej jednak, gdy myślę, że pytanie projektowe jest bardzo ważne, staram się odstąpić od prostego przykładu. Tutaj nie interesują mnie kolekcje, w których można je ustawić, w jaki sposób mogłyby one jeździć, gdyby kierowcy nie mieli wszystkich elemnentów "wszystkich"? być może mają taką samą kolejność ... ale to nie jest prośba. wniosek jest prawdziwy: jak zapewnić spójność. zmiana stanu przedmiotu może przerwać konsystencję. między indeksem a rzeczywistymi danymi. – AgostinoX

+0

Sugeruję ponowne przejrzenie planu pojedynczej listy i utworzenie wymaganej listy podrzędnej. – samlewis

Odpowiedz

2

Domyślam się, że chcesz "żyć" filtrowany widok z kolekcji wszystkie.

Można to zrobić całkiem ładnie z Google guawa i orzecznika:

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

Z drugiej strony, po prostu wykonawczych do personsWithDriversLicens list() {...} jest również łatwy, więc może Guava to przesada - w zależności od potrzeb, w tym charakterystyki wydajności.

Powiązane problemy