2011-10-07 77 views
0

是否可以创建大型静态资源文件?例如:创建大型静态资源文件有没有问题?

public class Resources { 
    public static String STRING1 = "xxx"; 
    public static String STRING2 = "xxx"; 
    ... 
    public static String STRINGN = "xxx"; 
} 

我想要一个大文件,它将包含应用程序将使用的所有字符串的列表。这会造成问题吗?我不完全确定静态类是如何保存在内存中的,所以我不知道这是否会导致内存问题。它太“丑”还是不好?有没有更好的方法来做到这一点?

+0

*这个班将会变得多大? – Qwerky

+0

谁能接受?什么? – bmargulies

+0

@Qwerky - 我不确定。它将包含应用程序所需的所有字符串。即。 “正在加载”“从服务器拉出”“(按钮文本)”等.... – AedonEtLIRA

回答

4

我将文件系统中的语言文件和其他文件保存为纯文本(或某些特殊格式)。然后您可以轻松地更改文字等。然后你可以编写一个静态类(LanguageFactory)来获取你的字符串。

示例语言文件:

英语文件

- OutGameMenu Strings--!

joinGame =加入游戏 createGame =创建游戏

LanguageFactory:

public class LanguageFactory { 
    private static final String PREFIX = "/languages/"; 
    public static final int ENGLISH = 1; 
    public static final int GERMAN = 2; 
    public static final int DEFAULT = ENGLISH; 
    //List of available InProperties: 

    public static final String JOIN_GAME = "joinGame"; 
    public static final String CREATE_GAME = "createGame"; 

    private static Properties language; 

    public static String getString(String text){ 
     if(language == null){ 
      setLanguage(DEFAULT); 
     } 
     return language.getProperty(text); 
    } 

    public static void setLanguage(int language){ 
     switch (language) { 
     case ENGLISH: 
      setLanguage("en.lang"); 
      break; 
     case GERMAN: 
      setLanguage("de.lang"); 
      break; 
     } 
    } 

    private static void setLanguage(String path){ 
     language = new Properties(); 
     try { 
      InputStream fi = LanguageFactory.class.getResourceAsStream((PREFIX+path)); 
      language.load(fi); 
      fi.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

所以,只需将所有字符串放在一行文本文件中。这可以工作,但我将如何确定什么字符串是什么? – AedonEtLIRA

+0

好吧,我明白了。然后就像@Joel说的那样,只需将其加载到地图中即可。我是否仍然需要班级中的字符串来充当密钥?或者你认为我应该只使用默认值(如果getString(“joinGame”)== null)text =“加入游戏愚蠢”)? – AedonEtLIRA

+0

我添加了一个基本的实现。 – MasterCassim

1

它会引起问题,如果该文件的大小是相对于可用工作内存量显著(老Gen)你已经分配。

大概你会把文件的内容加载到某种Map中?

如果您需要能够非常快速地访问文件中的数据,那么拥有内存中的表示形式是有意义的。

+0

我可以看到内存问题。取决于我实际使用的字符串数量以及它们的大小。目前,我无法猜测它会有多大。至于地图,不,我根本就没有打算使用一张 地图。例如,jist应该是:ApplicationLauncher类需要'ApplicationName'。它从AppStrings类访问静态字符串。 – AedonEtLIRA

+0

这实际上是您访问字符串的频率和速度的函数。 – Joel

1

我会留下属性文件。 (比如,NetBeans IDE就是这样做的)。国际化有足够的工具。你总是可以稍后迁移。首先是一个动态的ListResourceBundle。然后其他解决方案(如您自己的DB基础ResourceBundle)。

我什至不会包装它,所以你可以使用IDE支持(//NOI18N等)。 更好地花费你的时间来组织国际化词典,词组小册子 (“无法打开xxx文档。”)。 属性文件的一个问题是编码是带有\ u转义符的ISO-8859-1。 我的解决方案是一个maven插件,用于复制从UTF-8 Unicode过滤的资源。 并编辑UTF-8中的所有源文件。