Java Singleton对象多语言数据实现

时间:2015-10-15 09:41:17

标签: java singleton multiple-languages

假设有一个简单的类:

public class SingletonClass {
    private static SingletonClass singObj;

    private string variable1;
    private string variable2;
    .....

    public static synchronized SingletonClass getInstance() {
        if (singObj == null) {
            singObj = new SingletonClass();
        }
        return singObj;
    }
}

如果有很多字符串变量且需要以多种语言存储,那么在Java中管理它的标准方法是什么?

目前我使用:

public class SingletonClass {
    private static SingletonClass singObj_LANG1;
    private static SingletonClass singObj_LANG2;
    private static SingletonClass singObj_LANG3;

    private string variable1;
    private string variable2;
    .....

    public static synchronized SingletonClass getInstance(String lang) {
        if (lang.equals("English")) {
            if (singObj_LANG1 == null) {
                singObj_LANG1 = new SingletonClass();
            }
            return singObj_LANG1;
        }else if (lang.equals("Chinese")) {
            if (singObj_LANG2 == null) {
                singObj_LANG2 = new SingletonClass();
            }
            return singObj_LANG2;
        }else{
            if (singObj_LANG3 == null) {
                singObj_LANG3 = new SingletonClass();
            }
            return singObj_LANG3;
        }
    }
}

我认为这是一种不好的做法,任何更好的实施?

3 个答案:

答案 0 :(得分:6)

您需要的是internationalization

  

国际化是设计应用程序的过程   它可以适应各种语言和地区而不需要   工程变更。有时候国际化这个词就是   缩写为i18n,因为第一个之间有18个字母   “我”和最后一个“n。”

您需要使用Locale而不是lang的字符串变量。 您将邮件存储在ResourceBundle

  

资源包包含特定于语言环境的对象。当你的程序需要一个   特定于语言环境的资源,例如String,您的程序可以加载   它来自适合当前用户的资源包   语言环境。通过这种方式,您可以编写主要的程序代码   独立于用户的区域设置隔离大部分(如果不是全部)   资源包中的特定于语言环境的信息。这允许你   编写可以的程序:

     

可以轻松地本地化或翻译成不同语言的句柄   一次可以轻松修改多个语言环境以支持更多功能   区域设置

Java平台提供了两个ResourceBundleListResourceBundlePropertyResourceBundle的子类,它们提供了一种相当简单的方法来创建资源。 ListResourceBundle将其资源作为键/值对列表进行管理。 PropertyResourceBundle使用属性文件来管理其资源。

我建议的是PropertyResourceBundle,因为您应该将翻译后的值保留在属性文件中。

属性文件是一个简单的文本文件。您可以使用几乎任何文本编辑器创建和维护属性文件。

了解更多backing a ResourceBundle with Properties Files here 您可以阅读more about the concept here

最后,你最终会得到这样的混乱:

ResourceBundle messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
System.out.println(messages.getString("locale.language.key.example"));

我提供的链接代表了更广泛的国际化课程。您可以在那里浏览并阅读更多相关内容,最终您将学习最佳实践。使用框架变得更加容易。

采用这种方法,您将使用单一课程。

答案 1 :(得分:1)

我根本不会使用Singleton方法。 Java国际化是您所需要的:

https://docs.oracle.com/javase/tutorial/i18n/intro/steps.html

答案 2 :(得分:1)

我会使用Map作为特定语言单例的存储空间

private static Map<String, TheClass> map = new HashMap<>();
public static SingletonClass getInstance(String lang) {
    synchronized(map){
        if(map.containsKey(lang)) return map.get(lang);
        else{
            SomeClass it = new SomeClass();
            map.put(lang, it);
            return it;
        }
    }
}

但问题的更好解决方案是国际化(参见其他答案)