Java单例对象多语言数据实现

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

我认为这是一种不好的做法,有更好的实现方式吗?

最佳答案

你需要的是internationalization

Internationalization is the process of designing an application so that it can be adapted to various languages and regions without engineering changes. Sometimes the term internationalization is abbreviated as i18n, because there are 18 letters between the first "i" and the last "n."

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

Resource bundles contain locale-specific objects. When your program needs a locale-specific resource, a String for example, your program can load it from the resource bundle that is appropriate for the current user's locale. In this way, you can write program code that is largely independent of the user's locale isolating most, if not all, of the locale-specific information in resource bundles. This allows you to write programs that can:

be easily localized, or translated, into different languages handle multiple locales at once be easily modified later to support even more locales

Java 平台提供了 ResourceBundle 的两个子类,ListResourceBundlePropertyResourceBundle,它们提供了一种相当简单的创建资源的方法。 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"));

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

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

关于Java单例对象多语言数据实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33145074/

相关文章:

java - 如何在 Java EE 中调用电话

java - 大数据聚合适合业务层(JAVA)还是数据库层(存储过程)?

android - Android EditText 中的多语言问题

c++ - 带 “median of three”枢轴选择的Quicksort:了解过程

exception - 在 if() 和 try-catch 之间进行选择

java - 从多个 MBean 服务器取消注册 MXBean 时出现 NPE

Java - 静态编程风格

javascript - 如何在多个命名空间中命名函数?

java - Singleton 在 Spring 中是如何工作的?

scala - 定义 ADT 时案例对象 T 和案例类 T() 之间的差异?