假设有一个简单的类:
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;
}
}
}
我认为这是一种不好的做法,任何更好的实施?
答案 0 :(得分:6)
您需要的是internationalization
国际化是设计应用程序的过程 它可以适应各种语言和地区而不需要 工程变更。有时候国际化这个词就是 缩写为i18n,因为第一个之间有18个字母 “我”和最后一个“n。”
您需要使用Locale而不是lang的字符串变量。 您将邮件存储在ResourceBundle。
中资源包包含特定于语言环境的对象。当你的程序需要一个 特定于语言环境的资源,例如String,您的程序可以加载 它来自适合当前用户的资源包 语言环境。通过这种方式,您可以编写主要的程序代码 独立于用户的区域设置隔离大部分(如果不是全部) 资源包中的特定于语言环境的信息。这允许你 编写可以的程序:
可以轻松地本地化或翻译成不同语言的句柄 一次可以轻松修改多个语言环境以支持更多功能 区域设置
Java平台提供了两个ResourceBundle
,ListResourceBundle
和PropertyResourceBundle
的子类,它们提供了一种相当简单的方法来创建资源。 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;
}
}
}
但问题的更好解决方案是国际化(参见其他答案)