在某些Java类Struts2网应用程序,我有这样的行代码:

try {
    user = findByUsername(username);
} catch (NoResultException e) {
    throw new UsernameNotFoundException("Username '" + username + "' not found!");
}

我的老师要我改变扔声明变成像这样的东西:

static final String ex = "Username '{0}' not found!" ;
// ...
throw new UsernameNotFoundException(MessageFormat.format(ex, new Object[] {username}));

但是我没有看到这一点的使用MessageFormat:在这种情况。什么使得这种比简单的字符串连接?作为JAVA API for MessageFormat:说:

MessageFormat:提供一种手段产生连锁消息,在中性语言方式。使用这个建造消息显示最终用户。

我怀疑最终用户将会看到这个例外,因为它只会显示通过的日志应用程序无论如何我有一个自定义的错误页,为网络应用程序。

我应该改变的代码行或者坚持当前?

有帮助吗?

解决方案

  

我应该改变的代码行或与当前粘?

根据你的老师你应该。

也许他要你学同样的事情不同的方法。

当你提供它并没有多大意义的样品中,它使用其他类型的消息或对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!

然后,它将使感。

将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:允许外部化这些信息在文件。这可以让你:

  • 本地化的信息由的语言
  • 编辑的信息之外没有 修改源码

就个人而言,我会坚持使用级联的方式,但它只是一个偏好的问题。有些人认为这是清洁写有变量为一个字符串的字符串,然后传递PARAMS为字符串后的列表。您在字符串中有变数较多,地使用MessageFormat的更有意义,使,但你只有一个,所以它不是一个很大的区别。

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

由于这是一个教学的情况,虽然他会那样做只是为了告诉你如何使用这些类,而不是为这个特定的示例程序的最佳方式。

在编程的最佳方式而言,如果国际化是必须的,那么你需要为它的代码,如果没有的话就不要。我只增加了开销和时间(写的代码)无故。

步伐其他的答案,MessageFormat中对internationalizion的重要性不仅在于它可以更容易使外部文件。在其他语言中参数的位置可能是在消息的句子结构不同,所以使用的MessageFormat允许您更改每语言,一些字符串连接不会。

一个优点,我在使用MessageFormat看到的是,当你决定为则外您的字符串,这将是建立在消息和也,它更有意义看到“用户名要容易得多“{ 0}”不存在!”在资源文件作为一个字符串仅由一个ID访问。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top