Java SPI - выбор одной реализации - PullRequest
1 голос
/ 27 сентября 2019

Java SPI прост в использовании, когда мы хотим найти все доступные реализации интерфейса или абстрактного класса и выполнить действие с каждым из них:

ServiceLoader.load(SomeService.class)
    .forEach(service -> service.doSomething());

Какова идиома выбора одной реализации из несколькихдоступные реализации?Есть много сервисов, о которых я могу думать, что не имеет смысла работать с несколькими экземплярами.

Мы можем использовать iterator().next(), чтобы просто найти первую реализацию, которая возвращается из ServiceLoader, но это не предлагаетУ пользователя есть способ выбрать, какую конкретную реализацию он хочет подобрать, если это необходимо.Насколько я могу судить, порядок итераций несколько случайный и основан на непоследовательном порядке расположения путей к файлам META-INF / services.

Конечно, я что-то упустил, и об этом уже позаботилисьбез необходимости писать наше собственное «если установлено системное свойство, загрузите этот класс, иначе iterator.next из ServiceLoader»

1 Ответ

0 голосов
/ 27 сентября 2019

Какова форма выбора одной реализации из нескольких доступных реализаций?

Имеет смысл иметь несколько реализаций одновременно.

Так же, какпример:

interface ImageFilter {
    String getName();
    String getDescription();
    String getUsage();
    List<Parameter> getParameters();
    Image apply(Image image, List<Parameters> parameters);
}

Теперь ваша программа (служба, библиотека, ...) может работать с любым типом фильтра изображений, даже если он установлен после вашей программы.

Насколько я могу судить, порядок итераций

Вам просто нужно выполнить итерацию, чтобы узнать, какие реализации доступны, но вам не нужно использовать их немедленно.В примере с фильтром изображения вы должны выполнить итерацию, чтобы показать их в селекторе (например, используя getName), а пользователь выберет один для применения (apply), см. Подробную информацию (getDescription), использование, параметры,...

Но это только примеры, есть много других возможных сценариев (например, для расчета вы можете запустить все реализации параллельно и посмотреть, какая из них заканчивается раньше, или взять ту, которая достиглалучшая точность, ... или вы можете основывать выбор реализации на определенных аннотациях кода, ...).

С другой стороны, запись META-INF/services - это только один способ внедрить доступные реализациисм. Создание расширяемых приложений для получения подробной информации.

...