Domanda

In una certa classe Java per un'applicazione web Struts2, ho questa riga di codice:

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

Il mio insegnante mi vuole cambiare l'istruzione throw in qualcosa di simile a questo:

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

Ma non vedo il punto di utilizzare MessageFormat in questa situazione. Ciò che rende meglio di semplice concatenazione di stringhe? Come l'API JDK per MessageFormat dice:

  

MessageFormat fornisce un mezzo per produrre messaggi concatenati in modo indipendente dalla lingua. Usare questo per creare i messaggi visualizzati per gli utenti finali.

dubito che gli utenti finali avrebbero visto questa eccezione in quanto verrebbe visualizzato solo dai registri delle applicazioni in ogni caso e ho una pagina di errore personalizzata per l'applicazione web.

Devo cambiare la riga di codice o un bastone con la corrente?

È stato utile?

Soluzione

  

Devo cambiare la riga di codice o un bastone con la corrente?

Secondo il vostro insegnante vostro dovrebbe.

Forse vuole che impariate approcci diversi per la stessa cosa.

Mentre nel campione che hai fornito non ha molto senso, sarebbe utile quando si utilizzano altri tipi di messaggi o per i18n

Pensate a questo:

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

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

Si potrebbe avere un file messages_en.properties e messages_es.properties

La prima con la stringa:

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

E il secondo con:

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

Poi non avrebbe molto senso.

Un altro uso del MessageFormat è descritto nel 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));

L'output con valori diversi per FileCount:

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

Quindi, forse, il vostro insegnante è lasciare che si sa le possibilità che avete.

Altri suggerimenti

Gli insegnanti modo consente una più facile localizzazione, come si può estrarre una singola stringa piuttosto che diversi piccoli pezzi.

  

Ma non vedo il punto di usare   MessageFormat in questa situazione

In che specifica situazione non compra molto. In generale, utilizzando MessageFormat consente di esternare quei messaggi in un file. Questo consente di:

  • localizzare i messaggi per lingua
  • modificare i messaggi esterni senza modificare il codice sorgente

Personalmente, vorrei rimanere con il modo in cui la concatenazione, ma è solo una questione di preferenza. Alcune persone pensano che sia più pulita di scrivere una stringa con variabili come una stringa, e quindi passare i params come una lista dopo la stringa. I più variabili che avete nella stringa, il più senso utilizzare MessageFormat fa, ma hai solo uno, quindi non è una grande differenza.

Naturalmente se non avete bisogno di internazionalizzazione, è in testa, ma in fondo il codice come insegna la vuole è più "internazionalizzabile" (anche se in realtà non internazionalizzata come la stringa è ancora codificato duro).

Dal momento che questa è una situazione di insegnamento, anche se può essere farlo solo per mostrare come utilizzare tali classi, piuttosto che come il modo migliore per programmare per questo esempio specifico.

Per quanto riguarda il modo migliore per programmare, se l'internazionalizzazione è un requisito, allora avete bisogno di codice per esso, se non poi non lo fanno. I aggiunge solo in testa e il tempo (per scrivere il codice) per nessun motivo.

Pace le altre risposte, l'importanza di MessageFormat per internationalizion non è solo che lo rende più facile fare un file esterno. In altre lingue l'ubicazione del parametro può essere diverso nella struttura della frase dei messaggi, in modo da utilizzare MessageFormat consente di cambiare che per ogni lingua, qualcosa che concatenazione di stringhe non sarebbe.

Un vantaggio che vedo nel usando MessageFormat è che quando si decide di Esternalizza le corde, sarebbe molto più facile costruire il messaggio e anche, ha più senso per vedere "Nome utente '{ 0}' non trovato!" nel file di risorse come una stringa accessibile da un unico ID.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top