순수 기능 데이터 구조는 사용자 관점에서 변경할 수 없습니다. 그래서, 만약 해쉬 - 맵으로부터 키를 얻고, 기다린 다음, 같은 키를 다시 얻으면, 나는 같은 값을 얻어야 만합니다. 나는 열쇠를 잡을 수있어 사라지지 않는다.
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가 도달 할 수없는 부분 그래프를 자동으로 해제한다는 것입니다. –
나는 그것이 영구적 인 데이터 구조로 작동 할 수없고 두 가지 동작을 조화시키는 방법을 제공 할 수 없다고 구체적으로 말하고 있습니다. 당신 문제는 당신이 내가 그것에 도달 할 수 없다고 생각하는 것입니다,하지만 그럴 수 있습니다. 나는 물론 객체에 대한 참조를 가지고 있지 않지만 키가있다. –
귀하의 행동에 대한 귀하의 해석이 잘못되었습니다. * 키 *가 도달 할 수 없게되면 약한 해시 맵의 바인딩이 제거됩니다. 카운터 예제의 키를 누르고 있으므로 해당 키의 바인딩을 수집 할 수 없었고 그러한 문제가 없었습니다. o의 도달 가능성은 부적합하다. 정의 할 수없는 도달 할 수없는 값의 의미에만 영향을주기 때문에 영구 데이터 구조에서도 작동하지 않는 이유는 없습니다. –