2012-11-23 8 views
5

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

私は自分自身でHashMapクラスを拡張することを考えました。これは、そのようなチェックを行い、例外をスローします。しかし、HashMapのputは例外をスローしないので、私はそれを行うこともできません。

このような動作を達成するにはどうすればよいでしょうか?私はHashMapをより良いものに置き換える準備ができていますが、アイテムの追加と検索の両方で高速にする必要があります。

更新: ありがとうございます。私はJavaの完全な初心者ですから、今は最高のものを選ぶことができるように多くのことを学ぶ必要があります:)とにかく、昼休みにたくさんのオプションがあることに感謝します!

+0

コモンズコレクションは、それにふさわしい曝露を得ていません... – Isaac

答えて

0

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

+2

あなたはダウンしています、私の答えは有効です。私がdownvoterではなかった理由を与える – AlexWien

+1

私はdownvoterではなかったが、私はあなたが明示的に二重性チェックをOPが必要とする解決策を提案したdownvotingの理由は、それを自動的に行うメカニズムのために。 – Isaac

+1

@AlexWien私はdownvoteしなかったが、あなたはLiskov Substitution Principleに違反するだろう。 – Mik378

2

いくつかのアイデア:
A. HashMapを拡張するクラスでRuntimeExceptionを拡張する例外をスローします。
B. Map asパラメータを受け取るMapWrapperをいくつか用意してください。get、put、その他のメソッドがあり、より適したシグネチャがあります。これは、あなたが同じキーが既に存在する場合、キーと値のペアを挿入しようとしたときに例外がスローされますMapインスタンスを作成します

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


+0

'B'は既に存在します。下の私の答えを見てください。 – Isaac

+0

@ザスクリスコフ違反もこちらです。 – Mik378

+0

@ Mik378、ここでは「A」はLSPに違反します。 'B'はしません。しかし、「B」はCommons Collections(私の答えを参照)内ですでに利用可能であり、ホイールを再発明する必要はありません。 – Isaac

7

あなたはこのためCommons Collections、のようなものを使用することができます。

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

6

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

があなたのCustomHashMapクラスMapインタフェースを実装してHashMapフィールドをHAVINGを作成します。

代わりに、私は、組成物を使用します。 HashMapクラスに存在するすべてのメソッドを再宣言し、元のHashMapに代理を追加します。put()メソッドを除いて、それぞれentryが存在する場合は例外をスローします。

+0

+1はLSPに言及しています。 – texnic

0

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

1

javadoc for Map#put states:指定されたキーまたは値のいくつかのプロパティは、このマップに格納できない場合

は、私はあなたのユースケースは、そのカテゴリに該当すると思わはIllegalArgumentExceptionをスローし、したがって私はその可能性を使用します。チェックされていない例外なので、putメソッドでをラップし、IllegalArgumentExceptionを重複して投げることができます。