【问题标题】:Why Java locales are not constants?为什么 Java 语言环境不是常量?
【发布时间】:2014-11-07 10:42:15
【问题描述】:

Java 支持此link 中显示的Locales。

但我不明白为什么只有法国、加拿大、中国和美国等一些国家和意大利、日本和德国等一些语言的语言环境有常量。

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

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

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

【问题讨论】:

  • 你总是可以让你自己的常数;)
  • 当你说常数时,你是什么意思? java.util.Locale 中的 Locale 属性是静态的,但不是恒定的。您指的是什么常量位?
  • 常量表示(public/private) static final TYPE NAME = VALUE;。例如,Locale.ITALY 记录为“对国家/地区有用的常量”。

标签: java locale


【解决方案1】:

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

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

“Locale 类提供了许多方便的常量,您可以使用这些常量为常用的语言环境创建 Locale 对象。”

明显的含义是 Locale 常量尚未为其他国家和语言定义,因为当时认为语言环境在 Java 程序中“不太常用”。或者至少,不够常见,不足以保证添加相应的常量。 (我不知道这个决定是否基于客观证据。)

请注意,添加更多 Locale 常量会产生性能开销。更不用说由于国家更改名称等导致的各种兼容性问题。所以,基本上,他们必须在某个地方停下来……而当前的场景就是他们停下来的地方。

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

是否有提供语言环境常量的 Java 库?

AFAIK,不。由于上述原因,在我看来这是个坏主意。

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


作为记录,我在 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

【讨论】:

    【解决方案2】:

    虽然“为什么”问题是开放式的,但我认为可以肯定地说,这些常量的存在可能只是为了向后兼容。这里是Oracle's article about Internationalization, specifically, the pre-constructed locales

    如您所见,作者坦率地承认,所提供的常量并未涵盖所有“重要”国家(无论从何种角度来看),并且根本不应该使用它们。

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

    【讨论】:

      【解决方案3】:

      Why only some locales as constants?

      将任何语言环境设为常量确实是一个错误(正如 RealSkeptic 的回答所示)。国家不是一成不变的。它们来来去去,曾经的国家可能最终会被载入史册,不再常用(例如最近的苏联、南斯拉夫)。为不再存在的国家/地区设置方便的 Locale 常量是错误的。

      你可能会说,“那又怎样,让我们​​把所有国家都当作常数,如果它们不复存在,那有什么坏处”?问题是新国家也一直存在(例如东帝汶、科索沃)。要么必须不断地将新常量添加到列表中,这将带来其自身的兼容性问题,要么常量列表将保持(就像现在一样)及时冻结,仅代表 JDK 1.1 发布时存在的国家/地区。

      【讨论】:

        【解决方案4】:

        因为语言环境不是恒定的。还记得彼得建立国家“Petoria”的家庭成员的情节吗?

        【讨论】:

        猜你喜欢
        • 2019-03-24
        • 2011-09-22
        • 1970-01-01
        • 2018-07-25
        • 1970-01-01
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多