Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Stringデータのメンバへの格納方法

初めまして。java初心者です。
Stringデータをクラスのメンバに格納する際の
適切な処理について教えてください。

以下のコードを想定します。
--------------------------------------------------
-------------
public class Data {
     
   public int    userID;
   public String name;

}


public class Test {

    Data mData = new Data();

    public void funcA(){

      mData.userID = 1;      

      //処理1
      mData.name = funcB("Mike Davis");
      
      //処理2
      String addedData = funcB("Mike Davis");
      mData.name = new String(addedData);
    
    }

    private String funcB(String text){
        
        return text.subString(2,3);

    }


}
--------------------------------------------------
--------

処理1と処理2ではどちらが適切でしょうか。

処理1だとStringオブジェクトが不定のタイミングで
解放されてしまう気がします。
javaはGCがあるので、処理1でいいのでしょうか?

不安で困ってます。どなたか教えてくださるとうれしい
です。

4

回答

81781

閲覧

4件の回答

評価

10

処理1で大丈夫です。
mData.nameにセットされたStringが解放されるのは、
mData.nameに別の値をセットした後にGCが走った時や、
mDataが解放された状態でGCが走った時です。

処理2にも「funcBの結果を確認できる」
というデバッグ上の利点はありますが、
やるなら
String addedData = funcB("Mike Davis");
mData.name = addedData;
ですね。

new String(String)
は冗長なだけです。

評価

10

>java初心者です。
これは書かないで良い。
本人にその気があろうがなかろうが、「初心者だから甘えて
もいいよな」と考えてると取られることが多い。

>処理1だとStringオブジェクトが不定のタイミングで
解放されてしまう気がします。
どこかの変数がその値を使っている限り、解放されることは
ない。
この場合、.nameがそれを持っている限り解放されないし、内
部でも外部でもそこからまた別の変数へ代入すれば、その
後.nameにnullを代入しても解放されない。

逆に、自分としては使い終わったつもりになって、解放され
るだろうと思っていても、どこかに格納されていることで実
際には解放されず、メモリが足りなくなることもある。


評価

0

>satomi様
>$様

ありがとうございます。助かりました!

評価

0

> どこかの変数がその値を使っている限り、解放されることはない。
> この場合、.nameがそれを持っている限り解放されない

これは、ガベージコレクション(GC)の説明としては適切ではないですね。GCでは到達不能なオブジェクトが解放されます。オブジェクト変数に代入されているから解放されない、という局所的な考え方は誤りです。

mData.nameがオブジェクトAを参照していたとしても、到達不能になれば解放されます。たとえば、フィールド mData に null が代入されるとか、Test インスタンスを保持するオブジェクト変数に nullが代入される、といったことでもオブジェクトAへ到達できなくなるためGCの解放対象になります。

※Stringだとちょっと事情が異なります。一般のオブジェクトの話だと思ってください。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。