1

マップでキーとして使用される一連の値を表すクラスがあります。

このクラスは不変であり、静的ファクトリ パターンを使用して、個別の値のセットごとにシングルトンにしたいと考えています。目標は、同一のオブジェクトが何度も (100 回以上) 作成されるのを防ぎ、equals メソッドを最適化することです。

このクラスの以前のインスタンスをキャッシュして再利用する最良の方法を探しています。最初に頭に浮かぶのは単純なハッシュマップですが、代替手段はありますか?

4

3 に答える 3

4

次の 2 つの状況があります。

  • 個別のオブジェクトの数が少なく固定されている場合は、enum
    • 宣言された定数を超えてインスタンス化することはできず、そのEnumMapために最適化されています
  • それ以外の場合は、計画どおりに不変インスタンスをキャッシュできます。
    • 値が連続した範囲の数値でインデックス付けできる場合、配列を使用できます
      • これは、たとえばInteger、特定の範囲のインスタンスをキャッシュする方法ですvalueOf
    • それ以外の場合は、何らかの種類を使用できますMap

使用パターンによっては、これまでに作成されたすべてのインスタンスではなく、たとえば最後のNインスタンスのみをキャッシュすることを選択できます。re.compileこれは、 Python の正規表現モジュールなどで使用されるアプローチです。Nが十分に小さい場合(たとえば 5)、線形検索を使用した単純な配列でも問題なく動作する可能性があります。

Mapベース ソリューションの場合、おそらく便利な実装は です。java.util.LinkedHashMapこれにより@OverrideremoveEldestEntry.

このポリシーをより直接的に実装するLRUMapApache Commons Collectionsもあります。

こちらもご覧ください

関連する質問

于 2010-08-24T14:46:17.007 に答える
2

あなたが作ろうとしているものはFlyweight パターンの例のように聞こえるので、それへの参照を探すと、あなたの考えを明確にするのに役立つかもしれません.

それらをある種のマップに格納することは、実際に一般的な実装です。

于 2010-08-24T14:58:36.210 に答える
0

What do your objects look like? If your objects are fairly simple I think you should consider not caching them - object creation is usually quite fast. I think you should evaluate whether the possibly small performance boost is worth the added complexity and effort of a cache.

于 2010-08-24T15:02:08.530 に答える