Java における MessageFormat の利点
-
21-09-2019 - |
質問
Struts2 Web アプリケーションの特定の Java クラスには、次のコード行があります。
try {
user = findByUsername(username);
} catch (NoResultException e) {
throw new UsernameNotFoundException("Username '" + username + "' not found!");
}
先生は、throw ステートメントを次のように変更するよう求めています。
static final String ex = "Username '{0}' not found!" ;
// ...
throw new UsernameNotFoundException(MessageFormat.format(ex, new Object[] {username}));
しかし、この状況で MessageFormat を使用する意味がわかりません。これが単純な文字列連結より優れている点は何でしょうか?MessageFormat の JDK API には次のように書かれています。
MessageFormat は、言語に依存しない方法で連結メッセージを生成する手段を提供します。これを使用して、エンド ユーザーに表示されるメッセージを作成します。
いずれにせよ、この例外はアプリケーション ログによってのみ表示され、Web アプリケーション用のカスタム エラー ページがあるため、エンド ユーザーがこの例外を目にするとは思えません。
コード行を変更する必要がありますか、それとも現在のコードをそのまま使用する必要がありますか?
解決
の万一I現在でコードやスティックの行を変更する?の
あなたがすべきあなたの先生によります。
おそらく、彼はあなたが同じことのために異なるアプローチを学びたいです。
あなたがそれを提供したサンプルであまり意味がありませんが、メッセージの国際化やのための他のタイプを使用している場合、、それが有用であろう
このことについて考えてみます:
String message = ResourceBundle.getBundle("messages").getString("user.notfound");
throw new UsernameNotFoundException(MessageFormat.format( message , new Object[] {username}));
あなたはmessages_en.properties
ファイルを持っている可能性があり、A messages_es.properties
文字列で最初ます:
user.notfound=Username '{0}' not found!
とを有する第二ます:
user.notfound=¡Usuario '{0}' no encontrado!
それは理にかなってます。
のMessageFormatの別の用途は、に記載されていますDOCする
MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");
double[] filelimits = {0,1,2};
String[] filepart = {"no files","one file","{0,number} files"};
ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
form.setFormatByArgumentIndex(0, fileform);
int fileCount = 1273;
String diskName = "MyDisk";
Object[] testArgs = {new Long(fileCount), diskName};
System.out.println(form.format(testArgs));
FILECOUNTに異なる値を持つ出力
The disk "MyDisk" contains no files.
The disk "MyDisk" contains one file.
The disk "MyDisk" contains 1,273 files.
あなたが持っている可能性を知っているので、おそらくあなたの先生はさせて頂いております。
他のヒント
教師の方法は、より簡単にローカライズすることができます。
しかし、私はこの状況でmessageformatを使用することのポイントを見ていません
その中で 特定の この状況ではあまり得をしません。一般に、MessageFormat を使用すると、これらのメッセージをファイルに外部化できます。これにより、次のことが可能になります。
- メッセージを言語ごとにローカライズする
- ソースコードを変更せずに外部のメッセージを編集します
個人的には、連結方法に固執するだろうが、それは単に好みの問題です。一部の人々は、それが1つの文字列として変数に文字列を書き込み、その後、文字列の後にリストとしてのparamsを渡すきれいだと思います。それは大きな違いはありませんので、MessageFormatのを作るを使用していますが、一つだけを持っています。
あなたは、文字列で持っているより多くの変数を、より多くの意味はもちろん、それはオーバーヘッドですが、基本的に教えるなどのコードは(文字列はまだハードコーディングされているとして、実際に国際化されていないが)、それはより多くの「国際化」であるたいと考えています。
彼がどれだけこの特定の例のためのプログラムへの最善の方法として、これらのクラスを使用するのではなくする方法を紹介するためにそれをやっているかもしれません。
これは、教育の状況であるので、 国際化が必要条件であるならば、ないない場合は、プログラムへの最善の方法の面では、あなたは、それをコードすることが必要です。私は理由もなく(コードを書くこと)オーバーヘッドと時間を追加します。
ペース他の回答、internationalizionのためのMessageFormatの重要性は、それが簡単に外部ファイルを作成することができますということだけではありません。他の言語では、パラメータの位置はそれほどのMessageFormatを使用すると、あなたは言語ごとにそれを変えるために何かすることができ、メッセージの文の構造が異なっていてもよいという文字列の連結だろうありません。
MessageFormat
を使用して見ることを一つの利点は、あなたがあなたの文字列を外部化ののに決めるとき、メッセージを構築するためにはるかに容易になり、また、それは「ユーザー名「{参照する方が理にかなっているということです0}」が見つかりません!」あなたのリソースファイルに1つの文字列のみを1つのIDでアクセスしてます。