LoginSignup
8
8

More than 5 years have passed since last update.

WeakIdentityHashMapで任意のオブジェクトに外からフィールドを追加する

Last updated at Posted at 2014-05-27

任意のオブジェクトにフィールドを足し、そのオブジェクトが開放されたらその追加フィールドも開放されるようにしたい。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がありますね。

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8