Supongamos que tengo una estructura de datos List<Person> all
, donde Person
se define como:patrones java para mantener constante los índices en los datos en una colección
class Person {
String firstName;
String secondName;
boolean hasValidDrivingLicense;
}
Quiero MANTENER redundante List<Person> drivers
que contiene sólo las personas que tener una licencia de conducir válida. Creo que también se puede ver como un índice (así un índice contendría todos los ítems, pero el propósito es muy similar).
Esto es para evitar la necesidad de recorrer toda la lista cada vez que necesito esos datos.
(Looping cada vez tiene la ventaja de que tengo una representación autoritativa de mi información de hasValidDrivingLicense, el abandono de esta ruta requiere: a) razones válidas b) alternativa probada. Las razones dependen del problema específico; la alternativa es lo que estoy desarrollando aquí :-))
el problema
probablemente tengo algo como esto:
void add(Person p) {
all.add(p);
if (p.hasValidDrivingLicense()) {
drivers.add(p);
}
}
esto a menudo funciona.
Person p = new Person(); //then set fields, of course.
add(p);
p.setHasValidDrivingLicense(true);
Aquí no. Entonces, el problema es que la información redundante puede desalinearse. Los índices pueden "romperse".
soluciones
- propiedad hasValidDrivingLicense de la Persona aplicar patrón de diseño observable (o publicar abonado, lo que en su apogeo se basa en la interfaz de escucha) Si los objetos pueden cambiar y quiero que mis índices a ser de hasta -hasta la fecha con sus cambios, necesito una forma de notificar al index-mantainer que un objeto ha cambiado una propiedad relevante. Observable parece ser una solución definitiva. Sin preguntas al respecto.
- persona es inmutable
Problema
inmutabilidad parece ser una solución viable, pero, desde el punto de vista de colección mantenedor, que es la persona que escribe el código:
public void add(Person p) {
...
}
tiene que garantizar que p sea inmutable o mejor, que al menos has ValidDrivingLicense es definitiva.
a) esto se puede hacer a través de la reflexión (http://stackoverflow.com/questions/203475/how-do-i-identify-immutable-objects-in-java) Pero esto no requiere una nueva ¿Evaluación del desempeño? ¿La reflexión no tiene un costo?
b) existen, tal vez en patrones de diseño o en nuevas características del lenguaje (por ejemplo, anotaciones) otras soluciones a este problema?
@Louis Wasserman este es mi mejor esfuerzo. Creo que las preguntas de diseño son mucho más difíciles de plantear que las prácticas. Sin embargo, cuando pienso que una pregunta de diseño es muy importante, trato de dejar un simple ejemplo. Aquí estoy interesado NO en las colecciones que se alinearán, ¿cómo podrían ellos si los conductores no contienen todos los elementos de 'todos'? posiblemente ellos tengan el mismo orden ... pero esto no es una solicitud. la solicitud es real: cómo garantizar la coherencia. cambiar el estado de un elemento puede romper consistencia. entre índice y datos reales. – AgostinoX
Sugiero volver a visitar el plan de lista única y crear la lista secundaria según sea necesario. – samlewis