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

cas*_*lin 4 java locale

Java支持Locale链接中显示的

但是我无法弄清楚为什么只有法国,加拿大,中国和美国等某些国家/地区以及意大利语,日语和德语等某些语言的语言区域具有常量。

每当需要语言环境时,我都会查询支持的语言环境表,并使用Strings执行以下操作:

Locale locale = new Locale("pt", "BR");
Run Code Online (Sandbox Code Playgroud)

为什么只将某些语言环境作为常量?
是否有Java库可为语言环境提供常量?

Ste*_*n C 5

为什么只将某些语言环境作为常量?

的javadoc对Locale常量进行了这样的说明:

“ 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