Java:最良の実践例を共有化オブジェクト全体の多くのGUIオブジェ?
-
23-09-2019 - |
質問
池尾:そういうふうに考えてい練習のための共有化オブジェクト(この場合ResourceBundleがん保存すべての翻訳を多数GUIオブジェですか?いいアイデアでもない点:
1)通過ResourceBundleれGUIのクラスのコンストラクタ、そこで必要な保存ですべてのクラス(使用)-手段を有し、同じコードで各クラスにも
2)を宣言するResourceBundleとして、public staticではない最終のための変更が必要となるので(例:言語の変更)をGUIのクラスの例"public static ResourceBundle信ボックス")、その後でアクセスをいつでもよい(例:呼び出しMainGuiClass.msg.getString("何か"、その後で修正することも可能で/破壊によるその他のGUIのクラスと同じパッケージ---
ん、ありがとうございます何らかの良い実践の共有?
感謝。
解決
世界のResourceBundleオブジェクトではfinalであってはなりませんが代わりにすべきキャッシュマップを作成する。表示言語の変更を必要としませんはこの参照:
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
public class UIBundle {
private static final Map<Locale, ResourceBundle> allUIResources = new HashMap<Locale, ResourceBundle>();
public static String getString(final String key) {
return getString(key, Locale.getDefault());
}
public static String getString(final String key, final Locale locale) {
ResourceBundle rb = allUIResources.get(locale);
if (rb == null) {
rb = ResourceBundle.getBundle("my-ui-resource", locale);
allUIResources.put(locale, rb);
}
return rb.getString(key);
}
}
このコードではアクセスのテキストの特定の言語ロケールでのデフォルトロケールです。したい場合の切り替えのロケールをセットするだけで、実際にデフォルトロケールです。おUIのニーズを知るロケールの変更いものリスナーインタフェースのためのすべてのUIコンポーネント(PropertyChangeListener, PropertyChangeSupport なロケールを変更します。
他のヒント
あなたは、入力ロケールパラメータの値に基づいてのResourceBundleを返すキャッシュファクトリを実装することができます。最初の呼び出しの際のResourceBundleが構築され、その後工場の後の呼び出しで返され、再利用できる静的参照、にキャッシュされます。
あなたは、あなたがオブジェクトにしたくないことをやって、他のクラスを心配している場合は、それあなたがそれに実行したいメソッドを持つクラスの保護/プライベートフィールド作ります。
グローバル悪ですが、時には彼らの利便性が彼らの邪悪より大きいます。
クラスのResourceBundleが実装すでにキャッシュ、そう自分自身をキャッシュ実装する必要はありません。あなたのアクセスクラスはシングルトンとして実装することができます。
:私は、ロケールのためにThreadLocalを使用している言語を切り替えるにはpublic final class ThreadLocale extends ThreadLocal<Locale>
{
public static final ThreadLocale theInstance = new ThreadLocale ();
private ThreadLocale ()
{
super ();
}
protected Locale initialValue()
{
return Locale.getDefault ();
}
}
:私は現在のスレッドのロケールを使用し、バンドルのリソースからテキストを取得するアクセスクラス、の方法では、
public synchronized String getMessage (Object messageKey, Locale locale) throws MissingResourceException
{
ResourceBundle resourceBundle = null;
resourceBundle = ResourceBundle.getBundle (filename, ThreadLocale.theInstance.get ());
return resourceBundle.getString (messageKey.toString ());
}
あなたは世界的に各スレッドのロケールを設定し、することはできませんので。