12


5

Javaプロジェクトからすべての文字列を抽出する

私は、すべての文字列リテラルを解析して抽出し、古いJava定数を再生するようにそれらをファイルに入れる必要がある、かなり多数のソースファイルを持っています。 例えば:

Label l = new Label("Cat");

になるでしょう:

Label l = new Label(Constants.CAT);

そして `Constants.java`では、以下のようになります。

public final static String CAT = "Cat";

プロパティテキストファイルで文字列を外部化したくない 1つの理由は、一貫性とコードの読みやすさのためです。 もう一つは、私たちのクライアントコードが `GWT`を使っていることです。これはJavaプロパティテキストファイルメカニズムをサポートしていません。

私はある種のパーサを書くことができました(たぶんant replaceタスクを使って)。 しかし、私は `IDE`がすでにこの種のことを自動的にやるのかと思いました。

5 Answer


21


Eclipseはこれを自動的に行います。 ファイルを右クリックして[Source]を選択し、次に[Externalize strings]を選択します。

これはあなたが要求したこと(Constants.javaファイル内の文字列をStringsとして持つこと)を正確には実行しませんが、使用される方法は確かに非常に強力です。 ロケールに応じて動的にロードできるプロパティファイルにそれらを移動します。 あなたが提案するように別々のJavaソースファイルにそれらを持つことはあなたがあなたのアプリケーションにすべての言語を一度に持っていることを意味するか、ロケールによって異なるアプリケーションを出荷するでしょう。

基本的なものでも英語と日本語で出荷する必要があるアプリケーションには、これを使用します。当社のより複雑なアプリケーションは12の言語で出荷されます。 :-).

Javaファイルでそれらを望むなら、既に述べた欠点にもかかわらず、自由形式のJavaソースから文字列を抽出して抽出するよりも、プロパティファイルをJavaソースファイルに変形するプログラムを書く方がはるかに簡単です。

その後、実行時にそれらをロードするのではなく、(別のクラスの)組み込み文字列を使用するようにAccessorクラスを変更するだけです。


9


Peter Kelleyの回答を完成させるために、Eclipse IDEに* AST *ソリューションを検討することができます。

あなたはそれからあなたのソースコードを解析してあなたが望むことをするASTプログラムを書くかもしれません。

完全な例は、この Eclipseのコーナー記事にあります。詳細は、http://help.eclipseにもあります。 .org / help33 / index.jsp?topic = / org.eclipse.jdt.doc.isv / reference / api / org / eclipse / jdt / core / dom / ASTParser.html [eclipseヘルプ]。 そして、いくつかの例が Eclipseでのドメイン固有言語の埋め込みの自動化のセクション5のリスト5にあります。 JDT *]、https://github.com/search?q=%22org.eclipse.jdt.core.dom.ASTVisitor%22と並んで


1


これをしたくない理由がいくつかあります。 このような生成されたファイル(eclipse関数については私は知りませんでした)は、たとえばテストクラスのコンストラクター引数として設定している文字列と実際に必要なものを区別しないという事実は別として、もっと大きな問題は、あなたのすべての公開静的ファイナルがあなたのクラスにコンパイルされるということです、そしてあなたがクラスの振る舞いを変更したいなら、あなたは定数を保持するクラスだけでなくそれを参照するすべてを変更する必要があります。


1


私はPax Diabloが言ったことを完全に認めます。 その機能も使っています。

クラスファイルに適用すると、 "Externalize strings"関数は2つのファイル、クラスMessages.classとプロパティファイルmessages.propertiesを作成します。 それから、それはMessages.get(String key)への呼び出しと "Ext。"の文字列に入力したキーを使って、文字列リテラルのすべての直接使用をリダイレクトします。 String "ウィザード。

ところで:プロパティファイルの悪いところは何ですか? 彼が言ったように、あなたは単にプロパティファイルを変更することができ、テキストを変更する必要がある場合はクラスを変更する必要はありません。

もう1つの利点はこれです。文字列リテラルをプロパティファイルに抽出する方法では、コードを変更せずに*任意の言語でソース言語を自由に翻訳できます。 プロパティファイルローダーは、対応するファイルと言語ISOコードを使用して、ターゲット言語ファイルを自動的にロードします。 そのため、コードを実行するプラットフォームについて心配する必要はありません。適切な言語が(ほぼ)自動的に選択されます。 これがどのように詳細に機能するかについては、クラス ResourceBundleのドキュメントを参照してください。


0


NetBeansの Jackpot source transformation engineを調べて、ソース変換をスクリプト化することをお勧めします。