2017-01-28 6 views
0

私は授業でハードコードしたい巨大なヘルプテキストを用意しました。私たちは国ごとに異なる列挙型を持っていると言う、私は方法静的でないメソッドで定義された文字列値は、クラスオブジェクトでガベージコレクションされますか?

public interface HelpTextInterface { 
    public String getText(CountryEnum enum); 
} 

とサブクラスHelpTextAsiaEnglish、HelpTextEuropeEnglish、HelpTextAfricaEnglish、HelpTextAsiaHindiなど

public class HelpTextAsiaEnglish implements HelpTextInterface { 
    public String getText(CountryEnum country) { 
    switch(country) { 
     case CHINA: 
     return "large text about china in english"; 
     case JAPAN: 
     return "large string about japan in english"; 
     ..... 
     ..... 
     ..... 
    } 
    } 
} 

を持つHelpTextInterfaceを作成することができます私は国に応じて適切なヘルプテキストプロバイダクラスを呼び出すことができますロケール。この方法では、すべてのテキストが同時にメモリに読み込まれるわけではありません。特定の国に属するクラスのみが読み込まれます。私の質問は、もしHelpTextInterface型の変数を再割り当てすると、メソッドの一部である文字列もガベージコレクトされるか、クラスオブジェクトと共にメモリから取り除かれますか?たとえば、

A. HelpTextInterface ht = new HelpTextAsiaEnglish(); 
B. ht.getText(CountryEnum.INDIA); 
......... 
C. ht = new HelpTextAfricaHindi(); 

質問1:すべてのアジアの国に属する英語の文字列は、ステップAまたはステップBでいつメモリにロードされますか。

クエリ2:すべてのアジアの国に属している英語の文字列は、ステップCの後に収集したゴミを取得しますHelpTextAsiaEnglish()オブジェクトがもはや参照されないように、混乱がクラスローダの周りにある、私はそれがクラスHelpTextAsiaEnglishをアンロードするかどうかわかりませんステップCの後であってもしなくてもよい。

質問3:私の目標は、一度に1つの文字列しかメモリにロードされないようにすることです。これらの文字列メンバ変数を作成するような方法があります。

答えて

0

これは実装の詳細によって異なりますが、リファレンス実装のHotSpot/OpenJDKは、少なくともコードに到達できる限り、コードによってアクセスされたリテラルを表すStringインスタンスへの参照を保持します。

クラスは、ClassLoaderが到達可能で、少なくとも1つのクラスに到達可能であればClassLoaderが到達可能な限り、到達可能のままです。したがって、あなたのHelpTextInterfaceの実装は同じクラスローダ経由で配置されているため、ロードされた後はすべて到達可能な状態になります。

実装固有のため、それより悪い可能性があります。異なるJVM実装は、クラスをロードした直後にクラスのすべての文字列をインスタンス化できます。


あなたがそれらをリロードする必要性を前提とした場合、特に、返す文字列の唯一の目的とするクラスを作成するにはあまり意味がありません。コードベース内にファイルを作成し、getResourceなどを介してそれらを読み取る必要があります。これらの文字列はコードに関連付けられておらず、正常にガベージコレクションされます。または、たとえばを使用します。 PropertyResourceBundleはすでにこの目的に役立ち、テキストで定義されたリソースへのJavaインターフェイスを提供します。

関連する問題