MessageFormat在Java中的优点

时间:2009-10-14 15:39:11

标签: java string concatenation messageformat

在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应用程序的自定义错误页面。

我应该更改代码行还是坚持使用当前的代码?

6 个答案:

答案 0 :(得分:18)

  

我应该更改代码行还是坚持使用当前的代码?

根据你的老师,你应该。

也许他希望你为同样的事情学习不同的方法。

虽然在您提供的示例中没有太大意义,但在使用其他类型的消息或i18n时它会很有用

想一想:

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

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

您可以拥有messages_en.properties个文件和messages_es.properties

带字符串的第一个:

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

第二个:

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

然后它会有意义。

doc

中描述了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.

所以也许你的老师会告诉你你的可能性。

答案 1 :(得分:1)

教师方式允许更容易的本地化,因为您可以提取单个字符串而不是几个小位。

答案 2 :(得分:1)

  

但我没有看到使用的重点   MessageFormat在这种情况下

特定的情况下,它并没有给你带来太多帮助。通常,使用MessageFormat可以将这些消息外部化为文件。这允许您:

  • 按语言本地化消息
  • 在没有的情况下编辑外面的消息 修改源代码

答案 3 :(得分:0)

就个人而言,我会坚持使用连接方式,但这只是一个偏好问题。有些人认为将变量作为一个字符串编写一个字符串更清晰,然后将字符串作为列表传递给字符串。你在字符串中拥有的变量越多,使用MessageFormat的意义就越大,但你只有一个,所以它没有太大的区别。

答案 4 :(得分:0)

我在使用MessageFormat时看到的一个好处是,当您决定外化字符串时,构建消息会更容易,而且看起来更有意义“找不到用户名'{0}'!”在您的资源文件中作为只有一个ID访问的一个字符串。

答案 5 :(得分:0)

当然,如果你不需要国际化,那就是开销,但基本上教学的代码希望它更“国际化”(尽管实际上并没有国际化,因为字符串仍然是硬编码的)。

由于这是一种教学情况,尽管他可能只是为了向您展示如何使用这些课程而不是为这个特定的例子编程的最佳方式。

就最佳编程方式而言,如果需要国际化,那么您需要为其编码,如果不是,则需要编写代码。我只是无缘无故地增加了开销和时间(编写代码)。

除了其他答案之外,MessageFormat对国际化的重要性不仅在于它使得创建外部文件变得更容易。在其他语言中,参数的位置在消息的句子结构中可能不同,因此使用MessageFormat允许您更改每种语言,而字符串连接则不会。