Javaのインスタンスについて
参照型変数に代入される値は、メモリ上に作られたインスタンスへの参照ですが
Java
1Object o = new Object(); 2o = null;
このようなコードがあるとき変数oにnullが入ることにより、
変数oが参照していたインスタンスはどの変数からも参照されていない状態になります。
このインスタンスはGCの対象になると思うのですが、すぐに消されるわけでわないと思います。
もしこのインスタンスを利用したくなったとき
、再度このインスタンスをプログラム側で利用できる方法はあるのでしょうか?
全くどこからも参照されていないなら無理ですが、クロージャでキャプチャされていたりイベントを捕まえていたりすれば可能性があります。具体的にどう利用しようとしていますか?
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
具体的にどこで利用しようと考えて質問したわけではなく、GCの勉強中にふと再利用できるのか気になり質問させていただきました。
何なら自分自身が「こんなの質問しても役に立たないだろうなw」と思いつつ興味本位で質問しました。質問返しになってしまい申し訳ないですが、もし利用する機会があるのなら教えていただきたいです。m(__)m
回答に書いたように、ファイナライザで Java 由来でない、たとえば OS 由来のリソースを解放するのが唯一と言っていい利用法ではないかと思います。
弱参照は WeakReference などの、ガベージコレクションに影響を与えない三種類の参照のことですが、ガベージコレクションに影響を与えないとは言え、これは参照です。なので、「弱参照が無い場合」と但し書きを入れています。
弱参照経由でオブジェクトを変更することは許されません。この参照はガベージコレクションに影響しないので、いつ消えるかわからないからです。
回答の意味がわかったかわからないか、わからないならどこがわからないのかを書いてください。
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
私の知識不足で理解できないことが多かったので、自分で勉強して理解を深めようと思います。回答者の皆さんに追いつけるよう頑張ろうと思います。ありがとうございました!
どこがわからないかを書いてください。
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
Object o = nullとしてしまえば
ファイナライザをプログラマが明示的に呼ぶのは不可なのでは?と思いました。
タイミングを指定できなければならないとは質問のどこにもありません。
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
私は質問に「もしこのインスタンスを利用したくなったとき」と書きました。
なので、この質問を見た人は「どこからも参照されていない状態でプログラマが利用できるのかを聞きたいんだな」と理解してくださってくれると勝手に思っていました。たしかに回答者様のようにGCのファイナライザによる利用もこの質問に対する回答として合っています。これは見た人によって捉え方が変わってしまう質問の仕方をした私のミスです。今後は気をつけます。
申し訳ありません。m(__)m
それについては既に書きました。
> 全くどこからも参照されていないなら無理ですが、クロージャでキャプチャされていたりイベントを捕まえていたりすれば可能性があります。
「無理です」とはっきり書いています。それを踏まえてさらに踏み込んで聞きたいという要請に応えたものです。
つまり、あなたの質問に答えた上で質問の意図を尋ね、それに応えたものですが、それを「理解できませんでした」と放置するのはどういう了見ですか?
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
クロージャやイベント(これはマウスクリックのインタフェースなどでしょうか?)
にキャッチされているというものが理解できませんでした。
ただ、これ以上は聞くと回答者様の負担になってしまうと思ったので、自分で理解しようと思ったのです。
参照が無い物は自由に使えないというのは当然のことであって、それを無理やり使おうとすること自体が間違っています。普通にできるはずはありません。
しかしファイナライザでなら使えるしメリットもあり、使うコードも実際の現場で使われています。
利用法は示した通りで、あなたの想像とは違うものであったというだけのことです。
あなたの思う通りの利用法はできません。それは「無理」とはっきりと書いています。「無理」の二字が理解できませんでしたか?
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
「参照が無い物は自由に使えないというのは当然のことであって」これはあなたにとっては当然かもしれませんが私はできるかな?と好奇心で質問したのです。これ以上は回答を参考に自分で勉強するのでこれで終わらせてください。
それに対しては「無理」と書きました。この二文字の意味がわからなかったので放置したということですか?
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
放置というのはどういうことですか?
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
私は放置したつもりはありません。
私は自分から回答したのではありません。あなたに聞かれたから回答したのに放置した理由を尋ねています。嫌がらせであるなら次回からはやめていただきたい。広告の裏などを使ってください。
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
だからなぜ放置したと捉えたのですか?
放置というのは、自分から聞いたにも関わらず何の反応もせず、どこがわからないか聞くように再三言ったにも関わらず無視して「理解できないから終了」したことを指しています。次からはどうぞ人に迷惑のかからないところでしてください。
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
私は返信に1日から2日しか開けていませんよ?
無視して終了したじゃないですか。
今回の件に関してはいいので、次回からは広告の裏でどうぞ、と言っています。まだ何か?
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
終了というのはベストアンサーを決めたのが終了ということですか?
そこから?
![guest](/img/icon/icnUserSample.jpg)
回答4件
あなたの回答
tips
プレビュー