Reference って何やねん

強参照は、いつも通りプログラムを書いてるようなやり方。
弱参照は、強参照している変数から参照されなくなると参照が切れるやり方。
そう思っていた時期が、ボクにもありました。


というわけで、仕事中に Reference について調べてると、けっこう奥が深いなーと思ったので備忘録としてエントリを書いておこう!

強参照

Object obj = new Object();

はい、これが強参照!


これだけじゃアレなので補足。
通常どおり、変数に対してオブジェクトの参照を代入すると、強参照になるよってこと。
強参照って言葉がよくわかんねえよ!と言われても、普段通りだと考えればおk。

ソフト参照

ヒープがいっぱいいっぱいで GC したいなーってときに切れる参照。
キャッシュ機構を作るときに使うらしいよ!
うまいこと使うと、OutOfMemoryError の呪縛から逃れるっぽい。
変に使うとインスタンスを作っては GC されまくる、とても遅いシステムの出来上がり。
ご利用は計画的に。

Reference<Object> ref = new SoftReference<Object>(new Object());

ソフト参照自体はこれでできるっぽいね。

弱参照

GC するときにほぼ必ず切れる参照。

Reference<Object> ref = new WeakReference<Object>(new Object());

こういうことですね。

ファントム参照

理解するのが一番大変な参照。
説明書きでは切れた参照への参照とか書いてある。
うん、わけわかんないね。

Reference<Object> ref = new PhantomReference<Object>(new Object(), new ReferenceQueue<Object>());

参照が切れていることが前提なので、Reference.get() しても必ず null が返ってくる。
ReferenceQueue と一緒に使わないと意味がない。
使い道としては、GC されたタイミングで ReferenceQueue に参照オブジェクトが enqueue() されるので、いつ GC されたかを知るとか?
他、finalize() 後にヒープから回収される直前で何かするときとか。
なんかすごい絶妙なタイミングですな。

ReferenceQueue がキモっぽい?

ReferenceQueue をうまく使うっていうか、こいつを継承してやってイベントハンドラとか作ったりすれば、なんか面白いことできるのかな。
うーん、よくわからない。