Java Singleton对象多语言数据实现

use*_*817 1 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有很多字符串变量并且需要以多种语言存储,那么在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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Lau*_* L. 6

你需要的是国际化

国际化是设计应用程序的过程,以便它可以适应各种语言和区域而无需进行工程更改.有时,国际化一词缩写为i18n,因为第一个"i"和最后一个"n"之间有18个字母.

而不是lang的字符串变量,您需要使用Locale.您将消息存储在ResourceBundle中.

资源包包含特定于语言环境的对象.当您的程序需要特定于语言环境的资源(例如String)时,您的程序可以从适合当前用户的语言环境的资源包中加载它.通过这种方式,您可以编写程序代码,该程序代码在很大程度上独立于用户的语言环境,隔离资源包中大多数(如果不是全部)特定于语言环境的信息.这允许您编写可以:

可以轻松地本地化或翻译成不同语言,一次处理多个语言环境,以后可以轻松修改以支持更多语言环境

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

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

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

阅读更多支持带有属性文件的ResourceBundle 您可以在此处阅读有关该概念的更多信息.

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

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

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

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