一意的に変更できない1つのインスタンスのデザインパターンは悪とみなされますか?

私は有効なJavaに関する章を読んでいました。不変オブジェクトのインスタンスを1つだけ保持する利点について説明しました。アイデンティティの値を比較するのではなく、オブジェクトのID比較 x == y を行うことができます。

また、 javaのようなPOJOもあります。 awt.RenderingHints.Key では、一意的に変更できない1つのインスタンスのデザインパターンを使用することがよくあります。

    

このクラスのインスタンスは不変でユニークなので、より高価なequals()メソッドの代わりに==演算子を使って一致のテストを行うことができます。

  

私はこのアプローチでスピードブーストを理解することができますが、

しかし、このデザインパターンは最終的にメモリリークを引き起こしませんか?

1
理論的には、jvmは到達可能でないと判断した場合にクラス自体をアンロードすることができ、このように静的に参照されるオブジェクトを解放します。自分が割り当てていないオブジェクトについては心配しません。
追加された 著者 MeBigFatGuy,
@Pacerier:たとえば各モジュールに独自のクラスローダーがあるモジュールアプリケーション(OSGi、NetBeansプラットフォーム)で実装されています。モジュールをアンロードし、そのクラスローダーでこのクラスローダーによってロードされたこのモジュールのすべてのクラスが到達不能になる可能性があります(別のモジュールからの参照がない場合)
追加された 著者 Puce,
@MeBigFatGuyクラスはどのように「到達不能」とみなされますか? Btw私は同値比較を行うために参照値を使用するキャッシュを実装するための最良のソリューションは何か疑問に思っていましたか?
追加された 著者 Pacerier,

3 答え

はい、それはメモリの成長を引き起こす可能性があります(それが意図的な動作の場合はリークではありません)。それは、一意性契約がどのように指定されているかに依存します。たとえば、これらのオブジェクトの1つをディスクにシリアル化し、存在するスコープを終了してディスクから逆シリアル化すると、2つのうちの1つが発生します。つまり、同じオブジェクトを取得するか、別のオブジェクトを取得します。同じオブジェクトを取得した場合は、JVMの使用中に使用されるすべてのオブジェクトを保持する必要があり、メモリが増えます。別のオブジェクトを取得した場合は、そのオブジェクトが参照されている間だけオブジェクトが存在する必要があり、メモリが増えることはありません。

1
追加された

これは、フライウェイトパターンと呼ばれることがあります。特に、可能なオブジェクトのスペースが限定されている場合

1
追加された

キャッシュの実装に関しては、 http:// docsを選択することができます。 oracle.com/javase/6/docs/api/java/util/WeakHashMap.html を参照するか、境界のあるLRUキャッシュを実装できます。

0
追加された
私は、参照値を使って等価比較をしないオブジェクトのキャッシュに対して、これを行うことができるということです。しかし、参照値を使用して品質比較を行うオブジェクトのキャッシュにはこのソリューションを使用できませんでした。そうでないと、「リサイクル」されたときに参照が異なるためでした。 (そして比較 x == y )は失敗します。
追加された 著者 Pacerier,
私はあなたの声明を誤解しました。
追加された 著者 Ashwinee K Jha,