代码之家  ›  专栏  ›  技术社区  ›  Ramon Marco L. Navarro

Java中消息格式的好处

  •  5
  • Ramon Marco L. Navarro  · 技术社区  · 16 年前

    在一个特定的Java类中,对于Struts2 Web应用程序,我有这行代码:

    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的意义。什么比简单的字符串连接更好呢?正如消息格式的JDK API所说:

    messageformat提供了一种以非语言方式生成连接消息的方法。使用此选项可构造为最终用户显示的消息。

    我怀疑最终用户是否会看到这个异常,因为它只能由应用程序日志显示,而且我有一个Web应用程序的自定义错误页。

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

    6 回复  |  直到 10 年前
        1
  •  16
  •   Paco Abato    10 年前

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

    根据你的老师,你应该这样做。

    也许他想让你为同一件事学习不同的方法。

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

    想想这个:

    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));
    

    文件计数不同值的输出:

     The disk "MyDisk" contains no files.
     The disk "MyDisk" contains one file.
     The disk "MyDisk" contains 1,273 files.
    

    所以也许你的老师会让你知道你有什么可能。

        2
  •  1
  •   Steve    16 年前

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

        3
  •  1
  •   Kevin    16 年前

    但我看不出使用的意义 此情况下的消息格式

    在那 具体的 情况不太好。通常,使用messageformat可以将这些消息外部化到文件中。这允许您:

    • 按语言本地化消息
    • 编辑外部消息 修改源代码
        4
  •  0
  •   Jez    16 年前

    就个人而言,我会坚持串联的方式,但这只是一个偏好问题。有些人认为写一个变量为一个字符串的字符串,然后将参数作为一个列表传递到字符串之后会更干净。字符串中的变量越多,使用messageformat的意义就越大,但只有一个变量,所以没有什么区别。

        5
  •  0
  •   Yishai    16 年前

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

    因为这是一种教学情况,尽管他可能只是为了向你展示如何使用这些课程,而不是作为为这个具体例子编程的最佳方式。

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

    另一个答案是,messageformat对于国际化的重要性不仅仅在于它使生成外部文件更容易。在其他语言中,参数在消息的句子结构中的位置可能不同,因此使用messageformat可以更改每种语言的位置,而字符串串联则不会。

        6
  •  0
  •   bruno conde    16 年前

    我在使用中看到的一个优势 MessageFormat 当你决定 外化 你的字符串,它将更容易建立消息,而且,它更有意义地看到“用户名”0“找不到!”在您的资源文件中,作为只有一个ID访问的字符串。

    推荐文章