本Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用已不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参见Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息,请参见JDK发行说明。
Java平台不要求您在程序中使用相同的Locale
。如果需要,您可以为程序中的每个与区域设置相关的对象分配不同的Locale
。这种灵活性允许您开发多语言应用程序,可以显示多种语言的信息。
然而,大多数应用程序并不是多语言的,它们与区域设置相关的对象依赖于默认的Locale
。Java虚拟机在启动时设置默认的Locale
,该默认Locale
对应于主机平台的区域设置。要确定Java虚拟机的默认Locale
,调用Locale.getDefault
方法。
有可能独立设置两种类型的默认区域设置:格式设置用于格式化资源,显示设置用于菜单和对话框。在Java SE 7版本中引入,Locale.getDefault(Locale.Category)
方法接受一个Locale.Category
参数。将FORMAT
枚举传递给getDefault(Locale.Category)
方法会返回用于格式化资源的默认区域设置。类似地,传递DISPLAY
枚举会返回UI使用的默认区域设置。相应的setDefault(Locale.Category, Locale)
方法允许设置所需类别的区域设置。无参数的getDefault
方法返回DISPLAY
的默认值。
在Windows平台上,这些默认值根据Windows控制面板中的“标准和格式”和“显示语言”设置进行初始化。
不应该在程序中编程方式设置默认的Locale
,因为它是由所有与区域设置相关的类共享的。
分布式计算引发了一些有趣的问题。例如,假设您正在设计一个应用程序服务器,该服务器将接收来自不同国家的客户端请求。如果每个客户端的Locale
不同,那么服务器的Locale
应该是什么?也许服务器是多线程的,每个线程都设置为为其提供服务的客户端的Locale
。或者服务器和客户端之间传递的所有数据都应该是与区域设置无关的。
您应该采取哪种设计方法?如果可能的话,服务器和客户端之间传递的数据应该是与区域设置无关的。这样可以通过使客户端负责以与区域设置相关的方式显示数据来简化服务器的设计。然而,如果服务器必须以区域设置特定的形式存储数据,这种方法将不起作用。例如,服务器可能会在不同的数据库列中存储相同数据的西班牙语、英语和法语版本。在这种情况下,服务器可能希望查询客户端的Locale
,因为Locale
可能自上次请求以来发生了变化。