Frage

In einer bestimmten Java -Klasse für eine Struts2 -Webanwendung habe ich diese Codezeile:

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

Mein Lehrer möchte, dass ich die Wurfaussage in so etwas ändere:

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

Aber ich sehe nicht den Sinn, MessageFormat in dieser Situation zu verwenden. Was macht das besser als eine einfache String -Verkettung? Wie die JDK -API für MessageFormat sagt:

MessageFormat bietet ein Mittel, um verkettete Nachrichten auf sprachneutrale Weise zu erstellen. Verwenden Sie dies, um Nachrichten zu konstruieren, die für Endbenutzer angezeigt werden.

Ich bezweifle, dass die Endbenutzer diese Ausnahme sehen würden, da sie ohnehin nur von den Anwendungsprotokollen angezeigt wird und ich eine benutzerdefinierte Fehlerseite für die Webanwendung habe.

Sollte ich die Codezeile ändern oder beim Strom bleiben?

War es hilfreich?

Lösung

Sollte ich die Codezeile ändern oder beim Strom bleiben?

Laut Ihrem Lehrer sollte Ihr Sie sollten.

Vielleicht möchte er, dass Sie verschiedene Ansätze für dasselbe lernen.

Während es in dem von Ihnen bereitgestellten Beispiel nicht viel Sinn macht, wäre es nützlich, wenn Sie andere Arten von Nachrichten oder für i18n verwenden

Denk darüber nach:

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

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

Sie könnten eine haben messages_en.properties Datei und a messages_es.properties

Die erste mit der Zeichenfolge:

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

Und die zweite mit:

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

Dann würde es Sinn machen.

Eine weitere Verwendung des MessageFormat wird in der beschrieben Dokument

 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));

Die Ausgabe mit unterschiedlichen Werten für FileCount:

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

Vielleicht lässt Ihr Lehrer Sie über die Möglichkeiten, die Sie haben, wissen.

Andere Tipps

Der Lehrer -Weg ermöglicht eine einfachere Lokalisierung, da Sie eine einzelne Zeichenfolge anstelle mehrerer kleiner Bits extrahieren können.

Aber ich sehe nicht den Sinn, MessageFormat in dieser Situation zu verwenden

Darin Spezifisch Situation kauft Sie nicht viel. Mithilfe von MessageFormat können Sie diese Nachrichten in einer Datei externalisieren. Dadurch können Sie:

  • Lokalisieren Sie die Nachrichten nach Sprache
  • Bearbeiten Sie die Nachrichten außerhalb, ohne den Quellcode zu ändern

Persönlich würde ich mich bei der Verkettung halten, aber es ist nur eine Frage der Präferenz. Einige Leute denken, dass es sauberer ist, eine Zeichenfolge mit Variablen als eine Zeichenfolge zu schreiben und dann die Parameter als Liste nach der Zeichenfolge zu übergeben. Je mehr Variablen Sie in der Zeichenfolge haben, desto sinnvoller, wenn MessageFormat mehr macht, aber Sie haben nur einen, also ist dies kein großer Unterschied.

Wenn Sie keine Internationalisierung benötigen, ist es natürlich, aber im Grunde genommen der Code, wie es der Lehrer will, ist er "internationalisierbarer" (obwohl nicht tatsächlich internationalisiert, da die Saite noch hart codiert ist).

Da dies eine Unterrichtssituation ist, kann er es vielleicht nur tun, um Ihnen zu zeigen, wie Sie diese Klassen verwenden, und nicht als der beste Weg, um für dieses spezielle Beispiel zu programmieren.

Wenn die Internationalisierung am besten programmiert wird, müssen Sie dafür codieren, wenn nicht die Internationalisierung ist, wenn nicht. Ich fügt nur Overhead und Zeit hinzu (um den Code zu schreiben) ohne Grund.

Tempo die anderen Antworten, die Bedeutung von MessageFormat für Internationalisierung ist nicht nur, dass es einfacher ist, eine externe Datei zu erstellen. In anderen Sprachen kann der Ort des Parameters in der Satzstruktur der Nachrichten unterschiedlich sein. Mithilfe von MessageFormat können Sie diese pro Sprache ändern.

Ein Vorteil, den ich bei der Verwendung sehe MessageFormat ist das, wenn Sie sich dazu entscheiden externalisiert Ihre Saiten, es wäre viel einfacher, die Nachricht zu erstellen, und es ist auch sinnvoller zu sehen "Benutzername '{0}' nicht gefunden!" In Ihrer Ressourcendatei als eine Zeichenfolge, auf die nur eine ID zugegriffen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top