2015-10-15 81 views
1

假设有一个简单的类:Java的singleton对象多语言数据实现

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

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

回答

6

你需要的是internationalization

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

取代lang的字符串变量,您需要使用Locale。 您将邮件存储在ResourceBundle中。

资源束包含特定于语言环境的对象。当程序需要 特定于语言环境的资源(例如字符串)时,程序可以从适合当前用户的 语言环境的资源包中加载 。通过这种方式,您可以编写主要是 的程序代码,而不依赖于隔离资源包中特定于区域的大部分(如果不是全部)特定于区域的信息的用户语言环境。这允许您可以 写程序:

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

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")); 

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

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

+0

看来值需要在被初始化开始? – user1345817

+0

您可以随时在属性文件中写入值,而不仅仅是在正在运行的应用程序中。资源包只需指向这些文件,但它们需要使用语言环境或默认值进行初始化。资源包对象的范围取决于您的需要以及您如何设置它。 –

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

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