Question

Dans une certaine classe de Java pour une application web Struts2, j'ai cette ligne de code:

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

Mon professeur me veut changer l'instruction throw dans quelque chose comme ceci:

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

Mais je ne vois pas le point d'utiliser MessageFormat dans cette situation. Ce qui fait mieux que la concaténation de chaîne simple? Comme l'API JDK pour dit MessageFormat:

  

MessageFormat fournit un moyen pour produire des messages concaténés de manière linguistique neutre. Utilisez cette option pour construire des messages affichés pour les utilisateurs finaux.

Je doute que les utilisateurs finaux verraient cette exception car il ne serait affiché par les journaux d'application de toute façon et j'ai une page d'erreur personnalisée pour l'application Web.

Dois-je changer la ligne de code ou le bâton avec le courant?

Était-ce utile?

La solution

  

Dois-je changer la ligne de code ou le bâton avec le courant?

Selon votre professeur votre devrait.

Peut-être qu'il veut vous apprendre des approches différentes pour la même chose.

Alors que dans l'échantillon que vous avez fourni, il ne fait pas beaucoup de sens, il serait utile lorsque vous utilisez d'autres types de messages ou pour i18n

Pensez à ceci:

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

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

Vous pourriez avoir un fichier messages_en.properties et un messages_es.properties

La première avec la chaîne:

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

Et le second avec:

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

Alors il serait logique.

Une autre utilisation du MessageFormat est décrit dans le 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));

La sortie avec des valeurs différentes pour FileCount:

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

Alors peut-être votre professeur vous fait savoir les possibilités que vous avez.

Autres conseils

chemin des enseignants permet la localisation plus facile que vous pouvez extraire une seule chaîne plutôt que plusieurs petits morceaux.

  

Mais je ne vois pas le point d'utiliser   MessageFormat dans cette situation

Dans ce spécifique situation, il ne vous achetez pas beaucoup. En général, l'utilisation MessageFormat vous permet d'externaliser ces messages dans un fichier. Cela vous permet de:

  • localisent les messages en langue
  • modifier les messages en dehors sans modifier le code source

Personnellement, je collerait avec le chemin de concaténation, mais il est juste une question de préférence. Certaines personnes pensent qu'il est plus propre pour écrire une chaîne avec des variables comme une chaîne, et ensuite passer les params comme une liste après la chaîne. Plus variables que vous avez dans la chaîne, le plus de sens à l'aide MessageFormat fait, mais vous avez seulement un, il est donc pas une grande différence.

Bien sûr, si vous n'avez pas besoin d'internationalisation, il est en tête, mais essentiellement le code comme Teach veut il est plus « internationalisable » (bien que pas réellement internationalisé que la chaîne est toujours codé en dur).

Comme il est une situation d'enseignement, mais il peut le faire juste pour vous montrer comment utiliser ces classes plutôt que comme la meilleure façon de programmer cet exemple spécifique.

En ce qui concerne la meilleure façon de programmer, si l'internationalisation est une exigence, alors vous devez code pour elle, sinon, non. J'ajoute juste les frais généraux et le temps (pour écrire le code) sans raison.

Pace les autres réponses, l'importance de MessageFormat pour internationalizion est pas seulement il est plus facile de faire un fichier externe. Dans d'autres langues l'emplacement du paramètre peut être différent dans la structure de la phrase des messages, donc l'utilisation MessageFormat vous permet de changer que par langue, quelque chose que la concaténation de chaîne ne serait pas.

Un avantage que je vois à l'utilisation MessageFormat est que lorsque vous décidez de Externaliser vos chaînes, il serait beaucoup plus facile de construire le message et aussi, il est plus logique de voir « Nom d'utilisateur « { 0} » not found! » dans votre fichier de ressources comme une chaîne accessible par une seule ID.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top