Static ResourceBundle
Ich bin derzeit die Mittel für eine app, die Verwendung von ResourceBundle. Die Sache ist die, mit dem aktuellen code zu versenden, die Ressourcen, die ich brauchen würde, erstellen Sie eine Instanz der resource-bundle-jedes mal, wenn ich ihn brauche und ich denke das ist keine gute Idee, da würde ich am Ende das laden der Ressourcen, die sich wieder und wieder.
Die zweite Lösung wäre, teilen Sie das Bündel in vielen, Aber ich würde am Ende mit bundles haben nur 2-3 Saiten und gerne 15-bundles.
Meine Frage ist:
Gibt es eine Möglichkeit, einfach laden Sie alle Ressourcen in einem einzigen statische Klasse und greifen Sie von dort aus.
Ich dieses kleine Stück code, das scheint zu funktionieren für mich, aber ich bezweifle seine Qualität.
public class StaticBundle
{
private final static ResourceBundle resBundle =
ResourceBundle.getBundle("com.resources");
public final static String STRING_A = resBundle.getString("KEY_A");
public final static String STRING_B = resBundle.getString("KEY_B");
public final static String STRING_C = resBundle.getString("KEY_C");
}
Mit dieser, die ich anrufen kann StaticBundle.STRING_A
und den Wert überall im Projekt, aber da das bundle initialisiert wird zur gleichen Zeit wie die Klasse selbst... Es ist gut möglich, dass das Programm nicht die Zeit haben, laden Sie die richtigen lokalen Einstellungen.
Ist es ein guter Weg, dies zu tun, oder jede mögliche andere Lösung?
Danke
- Was Sie haben ist in Ordnung, wenn Sie verwenden Sie nur die Standard-locale laden Sie Ihre Schlüssel. Aber keine Sorge, zu viel über die Leistungen:
ResourceBundle.getBundle()
verwendet einen cache, und laden nicht die Ressourcen, jedes mal, wenn es aufgerufen wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie die Absicht haben, nur die Nachrichten, die für die Standard-locale dann, was Sie haben, ist in Ordnung.
Alternativ können Sie lassen Sie die Anrufer festlegen, welche Schlüssel es braucht, anstatt die Konstanten, wie diese:
Wenn Sie gerne mehrere Gebietsschemas unterstützen, dann der übliche Ansatz ist eine
Map<Locale, ResourceBundle>
Map<Locale, Map<String, String>
dort laden Sie die Ressourcen, die nur einmal für jedes Gebietsschema. In diesem Fall Ihre Klasse wäre eine Methode, wo der Anrufer kann geben Sie das Gebietsschema:Edit: Als korrekt darauf hingewiesen hat @JB Nizet (danke)
ResourceBundle
schon speichert eineMap
. Die benutzerdefinierte Lösung, die ich in die source-Beispiel, war über eine benutzerdefinierte Mechanismus ähnlichResourceBundle
einerMap
vonMap
s zu laden, übersetzungen von Schlüsseln in einem property=value-format, nicht nur aus Dateien, sondern auch eine Datenbank. Ich habe falsch gedacht, dass wir hatten eineMap
vonResourceBundle
in dieser Lösung. Das Quelle-Beispiel ist nun behoben.ResourceBundle.getBundle()
macht das schon, und es richtig macht, in eine thread-sichere Weise.Map<Locale, Map<String, String>>
für eine benutzerdefinierte Lösung. Meine Erinnerung mich betrogen und dachten, wir hättenMap<Locale, ResourceBundle>
. Ich bearbeitet meine Antwort zu korrigieren. Danke für den KommentarKönnen Sie erstellen einer singleton-Klasse:
Dann wird jeder Zugriff auf die gleiche Instanz der Klasse mit (get string für KEY_A, zum Beispiel):