Spec-Zone.ru › OpenJDK 25

Класс 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

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

Интерфейсы поставщиков служб, чувствительных к локали, соответствуют классам, чувствительным к локали, в пакетах java.text и java.util и предоставляют данные локали, используемые каждой службой. Эти интерфейсы позволяют создавать объекты, чувствительные к локали, и получать локализованные названия для этих пакетов. Фабричные методы, чувствительные к локали, и методы получения названий в пакетах java.text и java.util используют реализации интерфейсов поставщиков, чтобы обеспечить поддержку локалей, выходящих за пределы набора локалей, поддерживаемых самой средой выполнения Java. Поставщики служб, чувствительных к локали, развертываются в пути модулей приложения или пути классов приложения. Чтобы поставщики могли быть найдены, они должны быть доступны для system class loader. Дополнительные сведения о развертывании поставщика службы, чувствительной к локали, в качестве модуля или в пути классов см. в разделе Deploying Service Providers.

Упаковка реализаций поставщиков служб, чувствительных к локали

Для поставщика службы, чувствительной к локали, развернутого в модуле, в объявлении модуля необходимо указать директиву provides. Директива provides указывает как службу, так и поставщика службы.

Например, реализация класса DateFormatProvider, развернутая в виде модуля, может указывать следующую директиву:

    provides java.text.spi.DateFormatProvider with com.example.ExternalDateFormatProvider;

Поставщик службы локалей, развернутый в пути классов, идентифицирует себя с помощью файла конфигурации поставщика в каталоге ресурсов 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(String, String), так как это может не повлиять на порядок. Эталонная реализация JDK предоставляет следующие три поставщика данных локали:

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

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

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

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

Примечание по реализации:
JDK использует данные локали из Общего репозитория данных локалей (CLDR) Консорциума Unicode для реализации API, чувствительных к локали, в пакетах java.util и java.text. Эти данные локали определяют набор локалей, поддерживаемых средой выполнения Java. В следующей таблице перечислены версии CLDR, использованные в каждом выпуске JDK. Если не указано иное, во всех обновлениях одной линейки выпусков JDK используется одна и та же версия CLDR. Обратите внимание, что данные локали CLDR могут изменяться. Не следует полагать, что данные локали остаются одинаковыми в разных версиях CLDR. В противном случае могут возникнуть неожиданные несовместимые изменения поведения, например исключение при разборе даты. Сведения об изменениях между выпусками см. в разделе выпуски CLDR.
Выпуски JDK и поддерживаемые версии CLDR
Выпуск JDK Версия CLDR
JDK 25 CLDR 47
JDK 24 CLDR 46
JDK 23 CLDR 45
JDK 22 CLDR 44
JDK 21 CLDR 43
JDK 20 CLDR 42
JDK 19 CLDR 41
JDK 18 CLDR 39
JDK 17 CLDR 39
JDK 16 CLDR 38
JDK 15 CLDR 37
JDK 14 CLDR 36
JDK 13 CLDR 35.1
JDK 12 CLDR 33
JDK 11 CLDR 33
JDK 10 CLDR 29
JDK 9 CLDR 29
JDK 8 CLDR 21.0.1
Начиная с:
1.6

Краткое описание конструкторов

LocaleServiceProvider()
Модификатор Конструктор Описание
protected
Инициализирует новый поставщик службы локалей.

Краткое описание методов

Модификатор и тип Метод Описание
abstract Locale[] getAvailableLocales()
Возвращает массив всех локалей, для которых этот поставщик службы локалей может предоставлять локализованные объекты или названия.
boolean isSupportedLocale(Locale locale)
Возвращает true, если указанная locale поддерживается этим поставщиком службы локалей.

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

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

Подробное описание конструкторов

LocaleServiceProvider

protected LocaleServiceProvider()
Инициализирует новый поставщик службы локалей.

Подробное описание методов

getAvailableLocales

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

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

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

isSupportedLocale

public boolean isSupportedLocale(Locale locale)
Возвращает true, если указанная locale поддерживается этим поставщиком службы локалей. Указанная locale может содержать расширения, которые следует учитывать при определении поддержки.

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

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

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, способы обхода проблем и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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/25/docs/api/java.base/java/util/spi/LocaleServiceProvider.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API