Module java.base
Package java.util.spi

Class LocaleServiceProvider

java.lang.Object
java.util.spi.LocaleServiceProvider
直接已知的子类:
BreakIteratorProvider, CalendarDataProvider, CalendarNameProvider, CollatorProvider, CurrencyNameProvider, DateFormatProvider, DateFormatSymbolsProvider, DecimalFormatSymbolsProvider, LocaleNameProvider, NumberFormatProvider, TimeZoneNameProvider

public abstract class LocaleServiceProvider extends Object

这是所有区域敏感服务提供者接口(SPIs)的超类。

区域敏感服务提供者接口是与java.textjava.util包中的区域敏感类对应的接口。这些接口使得可以构建区域敏感对象并检索这些包的本地化名称。在java.textjava.util包中用于名称检索的区域敏感工厂方法和方法使用提供者接口的实现来支持Java运行时环境本身不支持的区域设置。

区域敏感服务提供者实现的打包

这些区域敏感服务的实现可以通过将它们添加到应用程序的类路径中来提供。提供者通过在资源目录META-INF/services中使用完全限定的提供者接口类名作为文件名的提供者配置文件来标识自己。该文件应包含一个完全限定的具体提供者类名列表,每行一个。行以换行符('\n')、回车符('\r')或紧接着回车符后跟换行符结束。忽略每个名称周围的空格和制表符,以及空行。注释字符为'#'('#');在每行上,第一个注释字符后的所有字符都将被忽略。文件必须以UTF-8编码。

如果特定的具体提供者类在多个配置文件中命名,或者在同一配置文件中多次命名,则重复项将被忽略。命名特定提供者的配置文件不必与提供者本身在同一个jar文件或其他分发单元中。提供者必须可以从最初查询以定位配置文件的相同类加载器访问;这不一定是加载文件的类加载器。

例如,DateFormatProvider类的实现应采取以下形式的jar文件,其中包含文件:

 META-INF/services/java.text.spi.DateFormatProvider
 
文件java.text.spi.DateFormatProvider应包含如下行:
 com.foo.DateFormatProviderImpl
 
这是实现DateFormatProvider的类的完全限定类名。

调用区域敏感服务

java.textjava.util包中的区域敏感工厂方法和名称检索方法在需要支持请求的区域时调用服务提供者方法。这些方法首先检查Java运行时环境本身是否支持请求的区域,并在可用时使用其支持。否则,它们调用已安装提供者的适当接口的isSupportedLocale方法,以找到支持请求的区域的提供者。如果找到这样的提供者,则调用其其他方法以获取请求的对象或名称。在检查区域是否受支持时,默认情况下会忽略Locale的扩展(如果还应检查区域的扩展,则必须重写isSupportedLocale方法)。如果Java运行时环境本身或已安装的提供者都不支持请求的区域,则这些方法将通过候选区域列表,并为每个重复的区域执行可用性检查,直到找到匹配项。用于创建候选区域列表的算法与默认情况下ResourceBundle使用的算法相同(有关详细信息,请参见getCandidateLocales)。即使从候选列表中解析了区域,返回请求的对象或名称的方法也将使用包括Locale扩展在内的原始请求区域调用。为了确保此过程终止,Java运行时环境必须支持根区域的所有区域敏感服务。

名称的提供者(但不是其他对象的提供者)允许对一些名称请求返回null,即使对于它们声称支持的区域也是如此,因为它们在getAvailableLocales的返回值中包含它们。同样,Java运行时环境本身可能没有支持的所有区域的所有名称。这是因为请求名称的对象集可能很大且随时间变化,因此不总是完全覆盖它们是不可行的。如果Java运行时环境或提供者返回null而不是名称,则查找将按上述描述进行,就好像区域不受支持一样。

区域敏感服务的搜索顺序可以通过使用java.locale.providers系统属性进行配置。此系统属性声明用户首选的查找区域敏感服务的顺序,用逗号分隔。由于此属性值仅在此类初始化时读取和缓存,因此用户应在java启动器命令行上指定该属性。在运行时使用System.setProperty(String, String)设置它是不鼓励的,可能不会影响顺序。JDK参考实现提供以下四个区域提供者:

  • "CLDR":基于Unicode Consoritum的CLDR项目的提供者。
  • "COMPAT":表示与之前的JDK版本(直到JDK 8,与JDK 8的“JRE”相同)兼容的区域敏感服务。此提供者已被弃用,并将在将来的JDK版本中删除。
  • "SPI":表示实现此LocaleServiceProvider类的子类的区域敏感服务。
  • "HOST":反映用户在底层操作系统中的自定义设置的提供者。这个提供者可能不可用,这取决于JDK参考实现。
  • "JRE":表示与“COMPAT”同义词。此名称已被弃用,并将在将来的JDK版本中删除。

例如,如果在属性中指定以下内容:

 java.locale.providers=SPI,CLDR,COMPAT
 
那么首先查找SPI提供者中的区域敏感服务。如果所需的区域敏感服务不可用,则按照CLDR、COMPAT的顺序查找。

查找首选区域提供者的默认顺序是“CLDR,COMPAT”,因此指定“CLDR,COMPAT”与默认行为相同。需要区域敏感服务的应用程序必须明确指定“SPI”,以便Java运行时从类路径加载它们。

自版本:
1.6
  • Constructor Details

  • Method Details

    • getAvailableLocales

      public abstract Locale[] getAvailableLocales()
      返回此区域服务提供者可以提供本地化对象或名称的所有区域的数组。此信息用于组成区域相关服务的getAvailableLocales()值,例如DateFormat.getAvailableLocales()

      此方法返回的数组不应包含仅在其扩展上有所不同的两个或更多个Locale对象。

      返回:
      可以提供本地化对象或名称的所有区域的数组
    • isSupportedLocale

      public boolean isSupportedLocale(Locale locale)
      如果给定的locale由此区域服务提供者支持,则返回true。给定的locale可能包含应考虑支持确定的扩展

      默认实现在忽略给定locale和可用区域中的任何扩展的情况下,如果给定locale等于getAvailableLocales()返回的任何可用Locale,则返回true。如果这些实现是Locale扩展感知的,则具体的区域服务提供者实现应覆盖此方法。例如,DecimalFormatSymbolsProvider实现将需要检查给定locale中的扩展,以查看是否指定了任何编号系统并且可以支持。然而,CollatorProvider实现可能不受任何特定编号系统的影响,在这种情况下,应忽略编号系统的扩展。

      参数:
      locale - 要测试的Locale
      返回值:
      如果给定的locale由此提供程序支持,则返回true; 否则返回false
      抛出:
      NullPointerException - 如果给定的localenull
      自版本:
      1.8
      参见: