2008-10-02 57 views
11

所有的字符串我有我需要分析和提取所有的字符串文字並把它們放在一個文件作爲播放的舊式Java不變的源文件的一個相當大的數字。
對於爲例:提取從Java項目

Label l = new Label("Cat"); 

將成爲:

Label l = new Label(Constants.CAT); 

而在Constants.java我會:

public final static String CAT = "Cat"; 

我不想琴絃在屬性文本被外部化文件。
一個原因是爲了一致性和代碼的可讀性。
另一個是我們的客戶端代碼使用GWT,它不支持Java屬性文本文件機制。

我可以寫某種解析器(使用Ant任務替換可能)?
但我想知道IDE是否已經自動做這種事情。

+0

「我們的客戶端代碼使用GWT,它不支持Java屬性文本文件機制」:這根本不是真的......確實,您不能直接從客戶端加載屬性文件,而是客戶端可以對服務器進行異步調用,並且服務器可以發回屬性對象(或者以您需要的任何形式發送數據)。你*可以*在客戶端使用屬性文件,只需要一兩步就可以完成。 – 2013-11-14 13:42:50

回答

9

要完成Peter Kelley的回答,你可以考慮爲eclipse IDE提供AST解決方案。

然後你可以編寫一個AST程序來解析你的源代碼並做你想做的事情。

一個完整的例子可在這eclipse corner article,也更詳細的eclipse help
你可以在Listing 5 of the section "Implementation of in-place translation" of Automating the embedding of Domain Specific Languages in Eclipse JDT以及multiple examples in GitHub projects旁找到一些例子。

21

Eclipse會自動執行此操作。右鍵單擊該文件,選擇「Source」,然後選擇「Externalize strings」

這並不完全符合您的要求(將Constants.java文件中的字符串作爲字符串),但所用的方法確實非常強大。它將它們移動到一個屬性文件中,該文件可以根據您的語言環境動態加載。根據您的建議,將它們放在單獨的Java源文件中意味着您將立即在應用程序中使用所有語言,或者根據語言環境發佈不同的應用程序。

我們用它爲我們的應用中,甚至連基本的東西,在英語和日語出貨 - 我們的更復雜的應用自帶了12種語言 - 我們是個不小的軟件開發公司以任何方式:-)。

如果希望他們在Java文件中,儘管已經提到的缺點,這是一個更容易編寫一個程序變形特性文件轉換成Java源文件比它試圖提取從字符串自由形式的Java源代碼。

所有,那麼你需要做的就是修改訪問器類使用內置的字符串(在單獨的類),而不是在運行時加載它們。

+0

我已經檢查過Eclipse,它將移動txt屬性文件中的所有字符串,然後由Messages.getString()加載。這不是我想要做的。我只想讓我的字符串扮演古老的Java常量。 – 2008-10-02 01:44:32

+0

這不是一個壞主意。一旦你有了這些,你可以尋找這些模式,並用你想要的替換它們。 – ykaganovich 2008-10-02 05:34:45

1

有一些很好的理由,爲什麼你不希望這樣做。除了任何這樣生成的文件(我不知道eclipse函數)不會區分你正在設置的字符串,例如,作爲測試類中的構造器參數以及實際上想要的東西常量,更大的問題是所有的公共靜態決策都將被編譯到你的類中,如果你想改變類的行爲,你不僅需要改變持有常量的類,而且還要改變引用它的所有類。

1

我完全承認什麼大同暗黑說。我們也使用該功能。

當應用於類文件時,函數「Externalize strings」將創建兩個文件,一個是Messages.class類和一個屬性文件是messages.properties。然後它會將字符串文字的所有直接用法重定向到對Messages.get(String key)的調用,並使用您在「Ext。String」嚮導中爲該字符串輸入的鍵。

BTW:屬性文件有什麼不好?正如他所說的,如果您需要更改文本,則只需更改屬性文件並不必更改該類。

另一個優點是:將字符串文字提取到屬性文件中的方式可讓您自由地翻譯您想要的任何語言的源語言,而無需修改任何代碼。屬性文件加載器通過使用帶有語言iso代碼的相應文件自動加載目標語言文件。因此,您不必擔心代碼運行的平臺,它會自動選擇適當的語言(幾乎)。請參閱類ResourceBundle的文檔以瞭解其詳細工作原理。