5

いくつかのキーと値のリストを持つクラスがあります。各キー (リスト内) は一意である必要があるため、HashMap を使用します。コードのどこかでリストに新しい項目を追加するとき、私は HashMap のput(K, V). 既に存在するキーを持つ項目を追加しようとすると、コードで例外がスローされるようにしたいと考えています。そして、そのような追加はプログラムの多くの場所で行われるため、それらすべてにチェックを追加することは避けたいと思います。したがって、既存のキーと値のペアを置き換えることができないのは、リスト クラス自体である必要があります。

このようなチェックを実行して例外をスローする独自のクラスで HashMap クラスを拡張することを考えました。ただし、HashMapputは例外をスローしないため、私も例外をスローできません。

そのような行動を達成するための良いアプローチは何でしょうか? HashMap をより良いものに置き換える準備はできていますが、アイテムの追加と取得の両方を高速にする必要があります。

更新: たくさんの素敵な提案をありがとう。私は Java の完全な初心者なので、最適なものを選択できるようにするには、多くのことを学ぶ必要があります :) とにかく、昼休みに非常に多くの選択肢を得ることができて感謝しています!

4

6 に答える 6

8

これには、次のようなCommons Collectionsを使用できます。

Map map = MapUtils.predicatedMap(new HashMap(), PredicateUtils.uniquePredicate(),
             null);

Mapこれにより、同じキーが既に存在するときにキーと値のペアを挿入しようとするたびに例外をスローするインスタンスが作成されます。

もちろん、独自のPredicateインスタンスを構築し、それを の代わりに使用することで、この動作をカスタマイズできますPredicateUtils.uniquePredicate()。独自のPredicateものは、必要なことは何でもできるため、たとえば、デフォルトでスローされるものとは異なるタイプの例外をスローする可能性がありますuniquePredicate()

于 2012-11-23T10:52:28.827 に答える
7

HashMapこの場合、基本クラスのメソッドの動作を変更するため、リスコフ置換原則に違反する可能性があるため、クラスを拡張しません。

代わりに、コンポジションを使用します。

インターフェイスを実装し、フィールドを持つCustomHashMapクラスを作成します。そして、クラスに存在するすべてのメソッドを再宣言し、メソッドを除くそれぞれの元のメソッドに委譲を追加します =>既に存在する場合は例外をスローします。MapHashMapHashMapHashMapput()entry

于 2012-11-23T10:53:35.007 に答える
2

いくつかのアイデア:
A. HashMap を拡張するクラスで、RuntimeException を拡張する例外をスローします。
B. パラメータとして Map を受け取り、get、put、およびその他のメソッドを持ち、より適したシグネチャを備えた、ある種の MapWrapper を提供します。

于 2012-11-23T10:51:28.940 に答える
1

Map#putのJavadoc には次のように記載されています

指定されたキーまたは値の一部のプロパティが原因でこのマップに格納できない場合、IllegalArgumentException をスローします

あなたのユースケースはそのカテゴリに分類されると思うので、その可能性を利用します。これは未チェックの例外であるため、コンポジションを使用し、メソッドで a をラップして、重複HashMapをスローすることができます。IllegalArgumentExceptionput

于 2012-11-23T11:06:14.973 に答える
0

RuntimeException を拡張する Exception をスローできます。

于 2012-11-23T10:51:15.970 に答える
0

HashMap を拡張して、RuntimeException のサブクラスである Exception をスローするか、put メソッドによって既にスローされた Exception の 1 つをスローできます。

于 2012-11-23T10:58:47.717 に答える