純粋に機能的なデータ構造は、ユーザーの観点からは変更できません。したがって、ハッシュマップからキーを取得して待機した後、同じキーを再度取得する場合、同じ値を取得する必要があります。私は鍵を握ることができるので、消えません。
APIが私に次世代を提供し、コンテナの過去のバージョンへのすべての参照が解放されるまで、値が収集されない場合は、唯一の方法です。データ構造のユーザーは、新世代に弱く保有されている値をリリースするよう定期的に求められます。 (コメントに基づく)
編集:私はあなたが望む行動を理解していますが、オブジェクトを解放するマップと、このテストに合格することはできません。
FunctionalWeakHashMap map = new FunctionalWeakHashMap();
{ // make scope to make o have no references
Object o = new SomeObject();
map["key"] = o;
} // at this point I lose all references to o, and the reference is weak
// wait as much time as you think it takes for that weak reference to collect,
// force it, etc
Assert.isNotNull(map["key"]); // this must be true or map is not persistent
私はこのテストが
を渡すことができることを示唆しています
FunctionalWeakHashMap map = new FunctionalWeakHashMap();
{ // make scope to make o have no references
Object o = new SomeObject();
map["key"] = o;
} // at this point I lose all references to o, and the reference is weak in the map
// wait as much time as you think it takes for that weak reference to collect,
// force it, etc
map = map.nextGen();
Assert.isNull(map["key"]);
弱いハッシュマップの全体のポイントは、GCが到達不能サブグラフを自動的にリリースするということです。プログラマが周期的にそれを要求する必要はありません。 –
私は、永続的なデータ構造ではうまく機能せず、2つの動作を調整する手段を提供できないと具体的に言っています。あなたの問題は、私がそれに到達することができないと思っていることですが、できます。オブジェクトへの参照はありませんが(もちろん)、キーがあります。 –
あなたの行動の解釈は間違っています。弱いハッシュマップのバインディングは、*キー*が到達不能になると削除されます。カウンターの例のキーを押し続けているため、そのキーのバインディングを収集できなかったため、そのような問題はありません。 'o'の到達可能性は無関係です。なぜなら、定義不可能な値の意味には影響しないからです。なぜなら、これは永続的なデータ構造ではうまく機能しません。 –