Параметры, возвращаемые значения метода stati c ServiceLoader.load ()? - PullRequest
0 голосов
/ 28 марта 2020

На самом деле это вопрос из трех частей.

Когда я посмотрел документацию по static ServiceLoader.load() методу класса ServiceLoader, он содержал

public static <S> ServiceLoader<S> load(Class<S> service)

1 Мне нужно знать, как вызвать этот метод, что это за параметр Class<S> service?

Предполагается, SomeClass является интерфейсом или абстрактным классом,

Я видел в примерах, что он использовал ServiceLoader.load(SomeClass.class)

2 Что здесь делает ключевое слово class, мы не можем просто поддержать SomeClass как параметр?

вот так,

ServiceLoader.load(SomeClass)

В документации, в которой содержался этот метод, возвращается новый загрузчик службы, я запутался с этим.

3 Возвращает ли этот метод массив всех реализаций интерфейса?

1 Ответ

1 голос
/ 03 апреля 2020
  1. Class<S> service - класс типа услуги; например, интерфейс или абстрактный класс, который должен быть реализован поставщиками услуг. load - это метод stati c, поэтому для его вызова достаточно использовать синтаксис ServiceLoader.load(SomeService.class).

  2. В load(Class<S> service) параметр - это класс типа услуги; Поэтому при вызове этого метода следует указывать .class.

  3. load(Class<S> service) возвращает новый экземпляр класса ServiceLoader. Этот класс реализует интерфейс Iterable. Когда вы вызываете iterator() для этого экземпляра, будет возвращен итератор, который лениво загружает поставщиков для службы этого загрузчика.

Здесь приведен пример кода, который помогает meybe. Интерфейс Adapter - это сервис, который должен быть реализован поставщиками услуг: класс

import java.util.Map;

public interface Adapter {
  String getName();

  String getApiVersion();

  void initialize();

  int calculateScore(Map<String, String> data);
}

и AdapterManager используется для загрузки поставщиков услуг:

import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;

public final class AdapterManager {
  private final static ArrayList<Adapter> adapters = new ArrayList<>();
  private final static AdapterManager INSTANCE = new AdapterManager();

  private AdapterManager() {
    load();
  }

  private static void load() {
    updateAdapters(findServiceProviders());
  }

  private static List<Adapter> findServiceProviders() {
    ServiceLoader<Adapter> serviceLoader = ServiceLoader.load(Adapter.class);
    List<Adapter> providerList = new ArrayList<>();
    for (Adapter provider : serviceLoader) {
      providerList.add(provider);
    }
    return providerList;
  }

  private static synchronized void updateAdapters(List<Adapter> adapterProviders) {
    adapters.clear();
    adapters.addAll(adapterProviders);
  }

  public static AdapterManager getInstance() {
    return INSTANCE;
  }

  public void reload() {
    load();
  }

  public Adapter getAdapter(String name) {
    if (name == null) {
      throw new IllegalArgumentException("Adapter name must not be null");
    }

    for (Adapter adapter : adapters) {
      if (name.equals(adapter.getName())) {
        return adapter;
      }
    }
    return null;
  }
}
...