簡體   English   中英

MessageFormat在Java中的優點

[英]Benefits of MessageFormat in Java

在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應用程序的自定義錯誤頁面。

我應該更改代碼行還是堅持使用當前代碼?

我應該更改代碼行還是堅持使用當前代碼?

根據你的老師,你應該。

也許他希望你為同一件事學習不同的方法。

雖然在您提供的示例中沒有太大意義,但在使用其他類型的消息或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的另一種用法

 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可以將這些消息外部化為文件。 這允許您:

  • 按語言本地化消息
  • 在不修改源代碼的情況下編輯外部消息

就個人而言,我會堅持使用串聯方式,但這只是一個偏好問題。 有些人認為將變量作為一個字符串編寫一個字符串更清晰,然后將字符串作為列表傳遞給字符串。 你在字符串中擁有的變量越多,使用MessageFormat產生的感覺越多,但你只有一個,所以它沒有太大的區別。

我在使用MessageFormat時看到的一個優點是,當你決定外化你的字符串時,構建消息會容易得多,而且更有意義的是看不到“用戶名'{0}'!” 在您的資源文件中只作為一個字符串訪問一個ID。

當然,如果你不需要國際化,那就是開銷,但基本上教學的代碼希望它更“國際化”(盡管實際上並沒有國際化,因為字符串仍然是硬編碼的)。

由於這是一種教學情況,盡管他可能只是為了向您展示如何使用這些類而不是作為此特定示例的最佳編程方式。

就最好的編程方式而言,如果需要國際化,那么你需要為它編碼,如果沒有則不需要。 我只是無緣無故地增加了開銷和時間(編寫代碼)。

除了其他答案之外,MessageFormat對國際化的重要性不僅僅在於它更容易制作外部文件。 在其他語言中,參數的位置在消息的句子結構中可能不同,因此使用MessageFormat允許您更改每種語言,而字符串連接則不會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM