java模式以保持集合中数据的索引一致

Ago*_*noX 5 java collections

假设我有一个List<Person> all数据结构,其中Person定义为:

class Person {
   String firstName;
   String secondName;
   boolean hasValidDrivingLicense;
}
Run Code Online (Sandbox Code Playgroud)

我想List<Person> drivers保留一个只包含有效驾驶执照的人的冗余.我认为它也可以被视为一个索引(一个索引将包含所有项目,但目的非常相似).
这是为了避免每次需要这些数据时都需要遍历整个列表.
(每次循环都有一个优势,即我拥有hasValidDrivingLicense信息的单权威表示;放弃这条道路需要:a)有效理由b)经过测试的替代方案.原因取决于具体问题; 替代方案是我在这里开发的:-))
问题
我可能有这样的事情:

void add(Person p) {
   all.add(p);
   if (p.hasValidDrivingLicense()) {
       drivers.add(p);
   }
}
Run Code Online (Sandbox Code Playgroud)

这通常有效.

Person p = new Person(); //then set fields, of course.
add(p);
p.setHasValidDrivingLicense(true);
Run Code Online (Sandbox Code Playgroud)

在这里它没有. 所以问题是:冗余信息可能不对齐.指数可能"破裂".

解决方案

  1. Person的hasValidDrivingLicense属性实现Observable设计模式(或发布订阅者,摆动的内容基于Listener接口)如果对象可以更改并且我希望我的索引与他们的更改保持同步,我需要一种方法来通知index-mantainer对象已更改相关属性.Observable似乎是一个明确的解决方案.没有问题.
  2. 人是不可改变的

问题

不可变性似乎是一个可行的解决方案,但从集合维护者的角度来看,那就是编写代码的人:

public void add(Person p) {
     ...
}
Run Code Online (Sandbox Code Playgroud)

必须确保p是不可变的或更好的,至少hasValidDrivingLicense是最终的.

a)这可以通过反思来完成(http://stackoverflow.com/questions/203475/how-do-i-identify-immutable-objects-in-java)但这不需要进行新的绩效评估吗?反思是否需要付出代价?

b)是否存在设计模式或语言的新特征(例如注释)这个问题的其他解决方案?

小智 2

我想您想要的是所有收藏的“实时”过滤视图。

使用 Google Guava 和谓词可以很好地完成此操作:

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.谓词%29

另一方面,仅仅实现 List PersonsWithDriversLicens() {...} 也很容易,所以也许 Guava 有点矫枉过正 - 取决于您的需求,包括性能特征。