Класс LocaleServiceProvider

Прямые известные подклассы:
BreakIteratorProvider, CalendarDataProvider, CalendarNameProvider, CollatorProvider, CurrencyNameProvider, DateFormatProvider, DateFormatSymbolsProvider, DecimalFormatSymbolsProvider, LocaleNameProvider, NumberFormatProvider, TimeZoneNameProvider
public abstract class LocaleServiceProvider
extends Object

Это базовый класс для всех интерфейсов поставщиков сервисов, чувствительных к локали (SPI).

Интерфейсы поставщиков сервисов, чувствительных к локали, — это интерфейсы, соответствующие классам, чувствительным к локали, в пакетах java.text и java.util. Эти интерфейсы позволяют создавать объекты, чувствительные к локали, и извлекать локализованные имена для этих пакетов. Чувствительные к локали фабричные методы и методы для получения имён в пакетах java.text и java.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.text и java.util вызывают методы поставщиков сервисов при необходимости для поддержки запрошенной локали. Методы сначала проверяют, поддерживает ли сама среда выполнения Java запрошенную локаль, и используют её поддержку, если она доступна. В противном случае они вызывают методы isSupportedLocale установленных поставщиков для соответствующего интерфейса, чтобы найти поставщика, который поддерживает запрошенную локаль. Если такой поставщик найден, его другие методы вызываются для получения запрошенного объекта или имени. При проверке, поддерживается ли локаль, расширения локали по умолчанию игнорируются. (Если расширения локали также должны проверяться, метод isSupportedLocale должен быть переопределён.) Если ни сама среда выполнения Java, ни установленный поставщик не поддерживают запрошенную локаль, методы перебирают список кандидатов на локаль и повторяют проверку доступности для каждого, пока не найдут совпадение. Алгоритм, используемый для создания списка кандидатов на локаль, по умолчанию такой же, как и в ResourceBundle, (см. getCandidateLocales для подробностей). Даже если локаль выбрана из списка кандидатов, методы, возвращающие запрошенные объекты или имена, вызываются с исходной запрошенной локалью, включая Locale расширения. Среда выполнения Java должна поддерживать корневую локаль для всех сервисов, чувствительных к локали, чтобы гарантировать, что этот процесс завершится.

Поставщикам имён (но не поставщикам других объектов) разрешается возвращать null для некоторых запросов имён даже для локалей, которые они заявляют о поддержке, включив их в своё значение, возвращаемое для getAvailableLocales. Аналогично, сама среда выполнения Java может не иметь всех имён для всех локалей, которые она поддерживает. Это связано с тем, что наборы объектов, для которых запрашиваются имена, могут быть большими и меняться со временем, поэтому полное покрытие всегда нереализуемо. Если среда выполнения Java или поставщик возвращает null вместо имени, поиск будет продолжен, как описано выше, как если бы локаль не поддерживалась.

Порядок поиска сервисов, чувствительных к локали, можно настроить, используя системную переменную "java.locale.providers". Эта системная переменная объявляет предпочтительный порядок поиска сервисов, чувствительных к локали, разделённых запятыми. Она читается только при запуске среды выполнения Java, поэтому последующий вызов System.setProperty() не повлияет на порядок.

Среда выполнения Java предоставляет следующие четыре поставщика локалей:

  • "CLDR": Поставщик, основанный на проекте CLDR Консорциума Юникода. CLDR Project.
  • "COMPAT": Представляет сервисы, чувствительные к локали, совместимые с предыдущими версиями JDK до JDK8 (аналогично "JRE" в JDK8).
  • "SPI": Представляет сервисы, чувствительные к локали, реализующие подклассы этого класса LocaleServiceProvider.
  • "HOST": Поставщик, отражающий пользовательские настройки в основной операционной системе. Этот поставщик может быть недоступен в зависимости от реализации среды выполнения Java.
  • "JRE": Представляет синоним "COMPAT". Это имя устарело и будет удалено в будущих версиях JDK.

Например, если в свойстве указано следующее:

java.locale.providers=SPI,CLDR,COMPAT
то сервисы, чувствительные к локали, в поставщиках SPI, ищутся в первую очередь. Если нужный сервис, чувствительный к локали, недоступен, то среда выполнения ищет CLDR, COMPAT в этом порядке.

По умолчанию порядок поиска предпочтительных поставщиков локалей — "CLDR,COMPAT", поэтому указание "CLDR,COMPAT" идентично поведению по умолчанию. Приложения, которым требуются реализации сервисов, чувствительных к локали, должны явно указать "SPI", чтобы среда выполнения Java загрузила их из пути класса.

С момента:
1.6

Конструкторы

Модификатор Конструктор Описание
protected LocaleServiceProvider()

Инициализирует новый поставщик сервисов локали.

Методы

Модификатор и тип Метод Описание
abstract Locale[] getAvailableLocales()

Возвращает массив всех локалей, для которых этот поставщик сервисов локали может предоставить локализованные объекты или имена.

boolean isSupportedLocale​(Locale locale)

Возвращает true, если заданная locale поддерживается этим поставщиком сервисов локали.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Конструкторы

LocaleServiceProvider

protected LocaleServiceProvider()

Инициализирует новый поставщик сервисов локали.

Исключения:
SecurityException - Если установлен менеджер безопасности и он отказывается от RuntimePermission("localeServiceProvider")

Методы

getAvailableLocales

public abstract Locale[] getAvailableLocales()

Возвращает массив всех локалей, для которых этот поставщик сервисов локали может предоставить локализованные объекты или имена. Эта информация используется для составления значений getAvailableLocales() локально-зависимых сервисов, таких как DateFormat.getAvailableLocales().

Массив, возвращаемый этим методом, не должен включать два или более Locale объектов, отличающихся только расширениями.

Возвращает:
Массив всех локалей, для которых этот поставщик сервисов локали может предоставить локализованные объекты или имена.

isSupportedLocale

public boolean isSupportedLocale(Locale locale)

Возвращает true, если заданная locale поддерживается этим поставщиком сервисов локали. Заданная locale может содержать расширения, которые должны учитываться при определении поддержки.

Реализация по умолчанию возвращает true, если заданная locale равна какой-либо из доступных Locales, возвращаемых getAvailableLocales(), игнорируя любые расширения как в заданной locale, так и в доступных локалях. Конкретные реализации поставщиков сервисов локали должны переопределять этот метод, если эти реализации Locale расширениями-ориентированные. Например, DecimalFormatSymbolsProvider реализации должны проверять расширения в заданной locale для проверки наличия указанной системы нумерации и возможности поддержки. Однако, CollatorProvider реализации могут не быть затронуты никакими конкретными системами нумерации, и в этом случае расширения для систем нумерации должны быть проигнорированы.

Параметры:
locale - тестируемая локаль
Возвращает:
true если заданная локаль поддерживается поставщиком; false в противном случае.
Исключения:
NullPointerException - если заданная локаль locale является null
С момента:
1.8
См. также:
Locale.hasExtensions(), Locale.stripExtensions()

© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/spi/LocaleServiceProvider.html

Spec-Zone .ru
спецификации, руководства, описания, API