解決しようとしている設計上の問題があります。つまり、そのオブジェクトにのみ関係し、そのオブジェクトが存続している間だけ使用できるリソースfinalize()
を解放するために使用しても大丈夫ですか?private static
詳細は次のとおりです...
まず、制約は次のとおりです。
デコレータパターンを使用して、
X
記述しなかったタイプ()をカプセル化します。X
サブクラス化されているfinal
ので問題外です。ラッパーにメソッドがあります。たとえば
x()
、いつでも基になるメソッドを返します。X instance
その理由は、ラッパータイプは、 パラメーター
x()
を期待する既存のAPIと互換性がある必要があるためです。X
ラッパーには、
X
インスタンスをパラメーターとして受け取るコンストラクターがあります。次に、カプセル化X
されたオブジェクトをこのインスタンスに設定します。
問題:
ラッパーにいくつかの機能/データを追加したいのですが、それを保持しています。つまり、ラッパーが「ラップX
解除」されると、コード内の他のポイントでラッパーに「再ラップ」される可能性があります。つまり、余分なデータは、基になるデータに含まれていなくても復元されます。X
。
これまでの私の考え:
キーが一意のIDであり、値が構造内のこの追加データであるラッパークラスで静的マップを作成するX
と、メソッド内でそれを取得できますrewrap(X x)
。
ラッパーまたはオブジェクトをマップのキーとして使用しません。X
これにより、GCが実行される可能性がなくなるため(マップから明示的に削除されない限り)、代わりに一意のハッシュコードを使用します。
これは原則として問題ないように見えますが、問題は、静的マップからこの余分なデータをいつ削除するかです。この場合、finalize()の実装を許可できますか?
finalize(){
map.remove(wrapperKey);
}
これが私の正当な理由です...finalize()に依存することは、一般にリソースを解放するのは悪い考えですが、ここでは、問題のリソースはオブジェクトに直接関係しています。外部リソースへの参照がないため、ラッパーオブジェクト自体がGCされるまでこれらの内部リソースが必要です。その時点で、リソースマッピングを削除するだけです。
最悪のシナリオでは、冗長なこれらの静的マッピングを削除する必要はありません。これにより、メモリリークが発生するためです。
この機能を実現し、既存のAPIとの下位互換性を維持する他の方法は考えられません。
public void foo(Wrapper wrapper){
bar(wrapper.x());
}
public void bar(X instance){...}
それが問題です、代替のアプローチや意見はありますか?
どうもありがとう
編集:さらに調査した後、同様の状況が弱参照 の主要な候補である可能性があるため、この質問を更新すると思いました