2011-10-07 61 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中的所有源文件。

相關問題