Pergunta

Em uma determinada classe Java para uma aplicação web Struts2, tenho esta linha de código:

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

Meu professor quer que eu mude a instrução throw para algo assim:

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

Mas não vejo sentido em usar MessageFormat nesta situação.O que torna isso melhor do que a simples concatenação de strings?Como diz a API JDK para MessageFormat:

MessageFormat fornece um meio de produzir mensagens concatenadas de maneira neutra em termos de linguagem.Use isto para construir mensagens exibidas para usuários finais.

Duvido que os usuários finais vejam essa exceção, pois ela só seria exibida pelos logs do aplicativo e eu tenho uma página de erro personalizada para o aplicativo da web.

Devo mudar a linha de código ou ficar com a atual?

Foi útil?

Solução

Devo alterar a linha de código ou ficar com a corrente?

De acordo com o seu professor, seu deveria.

Talvez ele queira que você aprenda abordagens diferentes para a mesma coisa.

Enquanto na amostra que você forneceu, não faz muito sentido, seria útil ao usar outros tipos de mensagens ou para i18n

Pense sobre isso:

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

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

Você poderia ter um messages_en.properties arquivo e a messages_es.properties

O primeiro com a string:

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

E o segundo com:

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

Então faria sentido.

Outro uso do MessageFormat é descrito no 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));

A saída com valores diferentes para o FileCount:

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

Então, talvez seu professor esteja informando as possibilidades que você tem.

Outras dicas

Os professores permitem localização mais fácil, pois você pode extrair uma única corda em vez de vários pequenos bits.

Mas não vejo o objetivo de usar o MessageFormat nesta situação

Naquilo específico situação não compra muito para você. Em geral, o uso do MessageFormat permite externalizar essas mensagens em um arquivo. Isso permite que você:

  • Localize as mensagens por idioma
  • Edite as mensagens fora sem modificar o código -fonte

Pessoalmente, eu preferiria o método de concatenação, mas é apenas uma questão de preferência.Algumas pessoas acham que é mais limpo escrever uma string com variáveis ​​como uma string e depois passar os parâmetros como uma lista após a string.Quanto mais variáveis ​​você tiver na string, mais sentido fará o uso de MessageFormat, mas você só tem uma, então não há grande diferença.

Obviamente, se você não precisa de internacionalização, é sobrecarga, mas basicamente o código como o ensino deseja que seja mais "internacionalizável" (embora não seja realmente internacionalizado, pois a corda ainda é codificada).

Como essa é uma situação de ensino, embora ele possa fazer isso apenas para mostrar como usar essas classes e não como a melhor maneira de programar para este exemplo específico.

Em termos da melhor maneira de programar, se a internacionalização é um requisito, você precisará codificar, caso contrário, não. Acabei de adicionar sobrecarga e tempo (para escrever o código) sem motivo.

Ritace as outras respostas, a importância do MessageFormat for Internationalizion não é apenas que facilita a criação de um arquivo externo. Em outros idiomas, a localização do parâmetro pode ser diferente na estrutura de frases das mensagens; portanto, o uso do MessageFormat permite alterar esse idioma, algo que a concatenação da string não o faria.

Uma vantagem que vejo ao usar MessageFormat é quando você decide externalizar Suas cordas, seria muito mais fácil construir a mensagem e também faz mais sentido ver "nome de usuário '{0}' não encontrado!" no seu arquivo de recursos como uma string acessada por apenas um ID.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top