5

List<Person> all私がデータ構造を持っていると仮定します。ここで、Personは次のように定義されます。

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

List<Person> drivers有効な運転免許証を持っている人だけを含む冗長性を維持したいと思います。インデックスとしても見ることができると思います(インデックスにはすべてのアイテムが含まれますが、目的は非常に似ています)。
これは、これらのデータが必要になるたびにリスト全体をループする必要がないようにするためです。
(毎回ループすることには、hasValidDrivingLicense情報の単一の権限のある表現があるという利点があります。この道路を放棄するには、a)正当な理由b)テスト済みの代替手段が必要です。理由は特定の問題によって異なります。代替案は私がここで開発しているものです:-)) 私はおそらく次のような
問題を抱えています:

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

これはよく機能します。

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

ここではそうではありません。 したがって、問題は次のとおりです。冗長な情報がずれている可能性があります。インデックスが「破損」する可能性があります。

ソリューション

  1. PersonのhasValidDrivingLicenseプロパティはObservableデザインパターンを実装します(またはpublish-subscriber、swingはListenerインターフェイスに基づいています)オブジェクトが変更される可能性があり、インデックスを最新の状態にしたい場合は、通知する方法が必要ですindex-オブジェクトが関連するプロパティを変更したことを示すマネタ。Observableは決定的な解決策のようです。それについての質問はありません。
  2. 人は不変です

問題

不変性は実行可能な解決策のようですが、コレクションメンテナの観点からは、コードを作成するのは次のとおりです。

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

pが不変以上であること、少なくともhasValidDrivingLicenseがfinalであることを確認する必要があります。

a)これはリフレクションを通じて行うことができます(http://stackoverflow.com/questions/203475/how-do-i-identify-immutable-objects-in-java)しかし、これには新しいパフォーマンス評価は必要ありませんか?リフレクションにはコストがかかりませんか?

b)おそらくデザインパターンや言語の新機能(注釈など)に、この問題に対する他の解決策がありますか?

4

1 に答える 1

2

あなたが望むのは、すべてのコレクションの「ライブ」フィルタービューだと思います。

これは、Google Guava と 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

一方、 List personsWithDriversLicens() {...} を実装するだけでも簡単なので、おそらく Guava はやり過ぎです - パフォーマンス特性などのニーズによって異なります。

于 2012-04-10T10:12:17.933 に答える