5

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 アプリケーション用のカスタム エラー ページがあるため、エンド ユーザーにこの例外が表示されるとは思えません。

コード行を変更する必要がありますか、それとも現在のものに固執する必要がありますか?

4

6 に答える 6

18

コード行を変更する必要がありますか、それとも現在のものに固執する必要がありますか?

あなたの先生によると、あなたはすべきです。

おそらく彼は、同じことに対するさまざまなアプローチを学んでほしいと思っているのでしょう。

あなたが提供したサンプルではあまり意味がありませんが、他のタイプのメッセージを使用する場合や i18n の場合に役立ちます

これについて考えます:

String message = ResourceBundle.getBundle("messages").getString("user.notfound");

throw new UsernameNotFoundException(MessageFormat.format( message , new Object[] {username}));

ファイルmessages_en.propertiesmessages_es.properties

最初の文字列:

user.notfound=Username '{0}' not found!

そして2つ目:

user.notfound=¡Usuario '{0}' no encontrado!

それなら理にかなっています。

MessageFormat の別の使用法はドキュメントに記載されています

 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.

ですから、先生はあなたの可能性を教えてくれているのかもしれません。

于 2009-10-14T15:43:45.510 に答える
1

教師の方法では、いくつかの小さなビットではなく単一の文字列を抽出できるため、ローカライズが容易になります。

于 2009-10-14T15:40:47.873 に答える
1

しかし、この状況で MessageFormat を使用する意味がわかりません

その特定の状況では、それはあなたをあまり買いません。一般に、MessageFormat を使用すると、これらのメッセージをファイルに外部化できます。これにより、次のことが可能になります。

  • メッセージを言語別にローカライズする
  • ソースコードを変更せずに外部でメッセージを編集する
于 2009-10-14T15:43:28.587 に答える
0

もちろん、国際化が必要ない場合、それはオーバーヘッドになりますが、基本的に、教えが望むコードはより「国際化可能」です (ただし、文字列はまだハードコードされているため、実際には国際化されていません)。

これは教育の状況であるため、この特定の例をプログラミングするための最良の方法としてではなく、これらのクラスの使用方法を示すためだけに行っている可能性があります。

プログラミングの最良の方法に関して言えば、国際化が要件である場合は、そのためにコーディングする必要があり、そうでない場合は必要ありません。理由もなく、(コードを書くための) オーバーヘッドと時間を追加するだけです。

他の回答に合わせて、国際化のための MessageFormat の重要性は、外部ファイルの作成を容易にするだけではありません。他の言語では、パラメーターの場所はメッセージの文構造で異なる場合があるため、MessageFormat を使用すると、言語ごとに変更できますが、文字列の連結では変更できません。

于 2009-10-14T15:49:01.937 に答える
0

個人的には、連結方法に固執しますが、それは好みの問題です。変数を含む文字列を 1 つの文字列として記述し、文字列の後に params をリストとして渡す方がクリーンだと考える人もいます。文字列に含まれる変数が多いほど、MessageFormat を使用する意味が増しますが、1 つしかないため、大きな違いはありません。

于 2009-10-14T15:41:57.433 に答える
0

を使用する利点の 1 つは、文字列を外部化MessageFormatすることを決定したときに、メッセージを作成するのがはるかに簡単になることです。1 つの ID のみによってアクセスされる 1 つの文字列として、リソース ファイルに記述されます。

于 2009-10-14T15:45:45.273 に答える