public abstract class LocaleServiceProvider extends Object
这是所有本地敏感的服务提供商接口(SPI)的超类。
区域设置敏感的服务提供者接口是与java.text
和java.util
包中的区域设置敏感类相对java.text
java.util
。 这些接口使得能够构建区域设置敏感对象并检索这些包的本地化名称。 在java.text
和java.util
软件包中使用区域敏感的工厂方法和名称检索方法,使用提供程序接口的实现来为Java运行时环境本身支持的语言环境提供支持。
如果特定的具体提供程序类在多个配置文件中命名,或者在同一配置文件中多次命名,那么重复的项将被忽略。 命名特定提供者的配置文件不需要与提供者本身在同一个jar文件或其他分发单元中。 提供程序必须可以从初始查询的相同类加载器访问以查找配置文件; 这不一定是加载文件的类加载器。
例如, 8846496749149类的实现应该采用包含该文件的jar文件的形式:
META-INF/services/java.text.spi.DateFormatProvider
而文件java.text.spi.DateFormatProvider
应该有一行如:
com.foo.DateFormatProviderImpl
它是一个实现类的完全限定类名DateFormatProvider
。
java.text
和java.util
包中的区域设置敏感的工厂方法和名称检索方法在需要时调用服务提供者方法来支持所请求的区域设置。 方法首先检查Java运行时环境本身是否支持所请求的区域设置,并使用其支持(如果可用)。 否则,他们将安装的提供程序的isSupportedLocale
方法调用相应的接口来查找支持所请求的区域设置的方法。 如果找到这样的提供者,则调用其他方法来获取请求的对象或名称。 当检查是否支持语言环境时,默认情况下locale's extensions将被忽略。 (如果还应检查区域设置的扩展名,则必须isSupportedLocale
方法。)如果Java运行时环境本身以及已安装的提供程序都不支持所请求的区域设置,则方法将通过候选区域设置列表,并重复每次可用性检查,直到找到了一个匹配。 用于创建候选语言环境列表的算法与默认情况下的ResourceBundle
使用的ResourceBundle
相同(有关详细信息,请参阅getCandidateLocales
)。 即使从候选列表中解析出语言环境,返回请求的对象或名称的方法也将使用原始请求的语言环境(包括Locale
扩展名)进行调用。 Java运行时环境必须支持所有区域设置敏感服务的根区域设置,以确保此过程终止。
名字(而不是其他对象的提供者)的供应商被允许返回null一些名的请求甚至,他们声称通过包括他们在为他们的返回值,以支持区域设置getAvailableLocales
。 类似地,Java运行时环境本身可能没有它支持的所有区域设置的所有名称。 这是因为要求名称的对象集可能很大,随时间而变化,因此完全覆盖它们并不总是可行的。 如果Java运行时环境或提供程序返回null而不是名称,则查找将如上所述进行,如同不支持语言环境一样。
从JDK8开始,可以通过使用“java.locale.providers”系统属性来配置区域设置敏感服务的搜索顺序。 此系统属性声明用户查找由逗号分隔的区域设置敏感服务的首选顺序。 只能在Java运行时启动时读取,所以稍后调用System.setProperty()不会影响顺序。
例如,如果在属性中指定了以下内容:
java.locale.providers=SPI,JRE
其中“SPI”表示在安装的SPI提供程序中实现的区域敏感服务,“JRE”表示Java运行时环境中的区域敏感服务,首先查看SPI提供程序中的区域敏感服务。
还有另外两个可能的区域设置敏感的服务提供商,即基于Unicode Consortium的CLDR Project的提供商“CLDR”,以及反映用户在底层操作系统中的自定义设置的提供商“HOST”。 这两个提供程序可能不可用,具体取决于Java运行时环境的实现。 指定“JRE,SPI”与默认行为相同,这与以前的版本兼容。
Modifier | Constructor and Description |
---|---|
protected |
LocaleServiceProvider()
唯一的构造函数。
|
Modifier and Type | Method and Description |
---|---|
abstract Locale[] |
getAvailableLocales()
返回此区域设置服务提供程序可以为其提供本地化对象或名称的所有区域设置的数组。
|
boolean |
isSupportedLocale(Locale locale)
如果本地服务提供商支持给定的
locale ,则返回
true 。
|
public abstract Locale[] getAvailableLocales()
getAvailableLocales()
值,例如DateFormat.getAvailableLocales()
。
通过该方法返回的数组不应该包括两个或者更多Locale
对象仅在它们的扩展名不同。
public boolean isSupportedLocale(Locale locale)
locale
,则返回true
。
给定的locale
可能包含extensions ,应该考虑到支持确定。
默认实现返回true
如果给定locale
等于任何可用的Locale
S按返回getAvailableLocales()
在两个指定忽略任何扩展locale
和可用的语言环境。 如果这些实现是Locale
扩展感知,那么具体的区域设置服务提供者实现应该覆盖此方法。 例如, DecimalFormatSymbolsProvider
实现将需要检查给定locale中的locale
,以查看是否指定了任何编号系统并可以被支持。 但是, CollatorProvider
实现可能不受任何特定编号系统的影响,在这种情况下,编号系统的扩展应该被忽略。
locale
- 要测试的
Locale
true
如果给定locale
由该供应商的支持;
false
否则。
NullPointerException
- 如果给定的
locale
是
null
Locale.hasExtensions()
,
Locale.stripExtensions()