1

假设有一个简单的类:

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

我认为这是一个不好的做法,有更好的实施吗?

4

3 回答 3

6

你需要的是国际化

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

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

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

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

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

我推荐的是PropertyResourceBundle因为您应该将翻译后的值保存在属性文件中。

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

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

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

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

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

采用这种方法,您将使用一个类。

于 2015-10-15T09:55:50.617 回答
1

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

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

于 2015-10-15T09:48:04.997 回答
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;
        }
    }
}

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

于 2015-10-15T09:57:56.000 回答