为什么Java语言环境不是常量?

时间:2014-11-07 10:42:16

标签: java locale

Java支持此Locale中显示的link

但我无法弄清楚为什么只有法国,加拿大,中国和美国等一些国家以及意大利,日本和德国等一些语言在其所在地区都有常数。

每次需要语言环境时,我都会查阅支持的语言环境表,并使用字符串执行以下操作:

Locale locale = new Locale("pt", "BR");

为什么只有一些语言环境作为常量?
是否有一个Java库为区域设置提供常量?

4 个答案:

答案 0 :(得分:4)

  

为什么只有一些语言环境作为常量?

Locale的javadoc说明了常量:

  

" Locale类提供了许多方便的常量,可用于为常用语言环境创建Locale对象。"

显而易见的含义是,Locale常量尚未针对其他国家/地区和语言定义,因为当时认为语言环境不太常用"在Java程序中。或者至少,不足以保证添加相应的常量。 (我不知道这个决定是基于客观证据还是基于直觉的。)

请注意,添加更多Locale常量会产生性能开销。更不用说由于各国更改名称等所引起的各种兼容性问题。所以,基本上,他们不得不停在某个地方......当前的设定就是停止的地方。

另一点需要注意的是,这些常量仅仅方便;即获取Locale对象的简单方法,您可以通过其他方式获得这些对象;例如使用Locale构造函数,或者调用Locale.lookup(...)

  

是否存在为区域设置提供常量的Java库?

AFAIK,没有。由于上述原因,在我看来似乎是一个坏主意。

当然,您始终可以定义自己的类,其中包含便于 应用程序的Locale常量。


为了记录,我在Java Bug数据库(在Google缓存中)发现了与此相关的RFE:

  

JDK-4399080:RFE:java.util.Locale.SPANISH和java.util.Locale.SPAIN不存在

此RFE针对Java 1.3.0进行了报告,并且已关闭,因为"赢得了修复"通过以下评估:

  

我们前一段时间决定不添加更多预定义的语言环境常量。写new Locale("es");new Locale("es", "ES");很容易,因此添加更多常量没有什么好处 - 特别是因为它不适用于涵盖所有语言和国家/地区。

     

norbert.lindenberg@Eng 2001-01-05

答案 1 :(得分:4)

虽然"为什么"问题是开放式的,我认为可以安全地说常量只是为了向后兼容而存在。这是Oracle's article about Internationalization, specifically, the pre-constructed locales

正如您所看到的,作者自由地承认所提供的常量并未涵盖所有"重要"国家(从任何角度来看),并且根本不应该使用它们。

今天的常量与JDK 1.1中的常量相同,所以我认为它们只是为了向后兼容而保留。

答案 2 :(得分:2)

Why only some locales as constants?

制作任何语言环境常量确实是错误的(正如RealSkeptic的答案所示)。国家不是一成不变的。他们来去匆匆,曾经是一个国家的人可能最终被托付给历史书籍而不再常用(例如最近苏联,南斯拉夫)。对于不再存在的国家/地区来说,拥有一个方便的Locale常量是错误的。

你可能会说,"那么,让我们把所有国家作为常数放在一起,如果它们不复存在,那么它的危害就在哪里呢?&#34 ;?问题是新的国家也一直存在(例如东帝汶,科索沃)。要么必须不断地将新常量添加到列表中,这将导致其自身的兼容性问题,或者常量列表将保留(现在)冻结的时间,仅代表JDK 1.1出现时存在的国家。

答案 3 :(得分:0)

因为Locales不是常量。请记住彼得创立国家" Petoria"?

的家庭男人的情节

enter image description here