将非静态方法中定义的字符串值用类对象获取垃圾?

时间:2017-01-28 08:31:24

标签: java string methods garbage-collection non-static

我有很多帮助文本,我想在课堂上硬编码。假设我们为国家/地区设置了不同的枚举,我可以使用方法

创建HelpTextInterface
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";
      .....
      .....
      .....
    }
  }
}

我可以根据国家和地区调用适当的HelpText提供程序类。这样,并非所有文本都会立即加载到内存中。只有属于特定国家/地区的类才会被加载。我的问题是,如果我重新分配一个类型为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 :(得分:0)

这取决于实现细节,但参考实现HotSpot / OpenJDK将保留对代表文字的String实例的引用,一旦它们被代码访问,至少只要代码可以访问。

只要可以访问ClassLoader ClassLoader,只要至少有一个类可以访问,HelpTextInterface仍然可以访问,则该类保持可访问状态。因此,显然,您的getResource实现是通过相同的类加载器定位的,一旦加载它们就会保持可达状态。

由于它是特定于实现的,它可能比这更糟糕。一个不同的JVM实现可以在加载类之后立即实例化类的所有字符串。

创建具有返回字符串唯一目的的类没有太大意义,特别是,如果您认为需要重新加载它们。您应该在代码库中创建文件并通过navigation controller等读取它们。这些字符串与代码无关,可以正常进行垃圾回收。或者使用,例如PropertyResourceBundle已经为此目的服务,并为文本定义的资源提供Java接口。