任意のオブジェクトにフィールドを足し、そのオブジェクトが開放されたらその追加フィールドも開放されるようにしたい。immutable objectだとWeakHashMapを使えばいいのですが、hashCode()を再定義したmutable objectだと、オブジェクトの状態が変わってhashCode()が無効になることがあるのでWeakHashMapは使えません。hashCode()ではなくSystem.identityHashCode()
を使えばいいので、それならIdentityHashMapが使えるかと思えばこちらはkeyがweak referenceではないのでオブジェクトのライフサイクルに従って追加フィールドが開放されることを期待できません。
というわけで、WeakIdentityHashMapをリリースしました。実装自体はいたるところにあるのですが、単体で簡単に使えるものが見当たらなかったので。
使い方は、以下のようにstatic finalでWIHMをもっておき
private static final WeakIdentityHashMap<ObjectClass, FieldClass> foo = new WeakIdentityHashMap<>();
あとは適当なアクセサを用意するだけ
public static void setFoo(ObjectClass object, FieldClass value) {
foo.put(object, value);
}
public FieldClass getFoo(ObjectClass object) {
return foo.get(object);
}
WeakIdentityHashMapはMaven Centralに上げてあるので以下の宣言出使えます。
dependencies {
compile 'com.github.gfx.util:weak-identity-hash-map:+'
}
なおObjectie-Cだと同じ用途でAssociative Referencesがありますね。