Pregunta

En una cierta clase de Java para una aplicación web Struts2, tengo esta línea de código:

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

Mi maestro me quiere cambiar la instrucción throw en algo como esto:

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

Pero no veo el punto de utilizar MessageFormat en esta situación. Lo que hace esto mejor que la simple concatenación de cadenas? A medida que la API del JDK para MessageFormat dice:

  

MessageFormat proporciona un medio para producir mensajes concatenados en forma independiente del idioma. Usar esto para construir mensajes que se muestran a los usuarios finales.

Me dudar de que los usuarios finales verían esta excepción, ya que sólo se mostraría por los registros de la aplicación de todas formas y tengo una página de error personalizada para la aplicación web.

¿Debo cambiar la línea de código o un palo con la corriente?

¿Fue útil?

Solución

  

¿Debo cambiar la línea de código o un palo con la corriente?

De acuerdo con el maestro de su debe.

Tal vez él quiere que usted aprenda diferentes enfoques para la misma cosa.

Mientras que en la muestra que ya ha proporcionado no tiene mucho sentido, sería útil cuando se utilizan otros tipos de mensajes o para i18n

Piense en esto:

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

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

Usted podría tener un archivo messages_en.properties y una messages_es.properties

La primera con la cadena:

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

Y el segundo con:

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

A continuación, tendría sentido.

Otro uso de la MessageFormat se describe en la 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 salida con diferentes valores para FileCount:

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

Así que tal vez su maestro le permite saber las posibilidades que tiene.

Otros consejos

Profesores manera permite una localización más fácil como se puede extraer una sola cadena en lugar de varios pequeños trozos.

  

Pero no veo el punto de utilizar   MessageFormat en esta situación

En ese específica situación que no compra que mucho. En general, el uso de MessageFormat le permite exteriorizar esos mensajes en un archivo. Esto le permite:

  • localizar los mensajes por idioma
  • editar los mensajes exterior sin modificar el código fuente

En lo personal, me gustaría seguir con la forma en la concatenación, pero es sólo una cuestión de preferencia. Algunas personas piensan que es más limpio para escribir una cadena con variables como una cadena y, a continuación, pasar los parametros como una lista después de la cadena. Los más variables que tiene en la cadena, el más sentido usar MessageFormat hace, pero sólo tiene una, así que no es una gran diferencia.

Por supuesto, si usted no necesita la internacionalización, que es la cabeza, pero básicamente el código como enseña la quiere es más "internacionalizar" (aunque en realidad no internacionalizado como la cadena todavía está codificado).

Como se trata de una situación de enseñanza, a pesar de que puede estar haciéndolo sólo para mostrar cómo utilizar esas clases y no como la mejor forma de programar para este ejemplo concreto.

En cuanto a la mejor manera de programar, si la internacionalización es un requisito, entonces usted necesita para codificar para que, si no, no lo hacen. Yo sólo implica una sobrecarga y el tiempo (para escribir el código) sin ninguna razón.

Pace las otras respuestas, la importancia de MessageFormat para internationalizion no es sólo que hace que sea más fácil hacer un archivo externo. En otros idiomas la ubicación del parámetro puede ser diferente en la estructura de la oración de los mensajes, por lo que usar MessageFormat le permite cambiar que por cada idioma, algo que no haría concatenación de cadenas.

Una de las ventajas que veo en el uso de MessageFormat es que cuando se decida a externalize sus cadenas, sería mucho más fácil construir el mensaje y también, tiene más sentido para ver "nombre de usuario '{ 0}' no encontrado!" en el archivo de recursos como una cadena accede por un único ID.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top