Перейти к основному содержимому

Автосервис Google

· 3 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Введение

В этом кратком руководстве мы кратко объясним AutoService Google.

Это библиотека процессора аннотаций, которая помогает нам создавать файлы конфигурации Java Service Provider Interface (SPI).

2. Java SPI

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

Java SPI использует файлы конфигурации для поиска и загрузки конкретных реализаций заданных интерфейсов поставщика услуг. Настройка приложения «на лету» — одна из его основных возможностей.

С другой стороны, легко неправильно настроить, а также немного запутать нас, добавляя или редактируя файлы конфигурации. Этот шаг также легко забыть.

Кроме того, всегда есть риск опечаток, которые мы можем не заметить, так как файлы конфигурации не учитываются компилятором.

3. Автосервис Google

Google AutoService — это инструмент для генерации кода с открытым исходным кодом, разработанный в рамках проекта Google Auto. Кроме AutoService есть еще два инструмента: AutoValue и AutoFactory .

Цель этой библиотеки — сэкономить усилия и время и в то же время предотвратить неправильную настройку .

3.1. Настройка Maven

Во-первых, давайте добавим зависимость автосервиса в наше приложение. Мы можем установить зависимость как необязательную , потому что она нужна нам только во время компиляции:

<dependency>
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service</artifactId>
<version>1.0-rc5</version>
<optional>true</optional>
</dependency>

3.2. Пример @AutoService

Во-вторых, мы создадим интерфейс поставщика услуг.

Предположим, что в нашем приложении есть функция перевода. Мы стремимся сделать эту функцию расширяемой. Таким образом, мы можем легко подключить любой компонент поставщика услуг перевода:

public interface TranslationService {
String translate(String message, Locale from, Locale to);
}

Наше приложение будет использовать этот интерфейс в качестве точки расширения. Реализация пути к классам будет внедрена как компонент.

Далее мы реализуем этот сервис с двумя разными поставщиками переводов, используя аннотацию @AutoService :

@AutoService(TranslationService.class)
public class BingTranslationServiceProvider implements TranslationService {
@Override
public String translate(String message, Locale from, Locale to) {
// implementation details
return message + " (translated by Bing)";
}
}
@AutoService(TranslationService.class)
public class GoogleTranslationServiceProvider implements TranslationService {
@Override
public String translate(String message, Locale from, Locale to) {
// implementation details
return message + " (translated by Google)";
}
}

Во время компиляции AutoService будет искать аннотацию и генерировать файл конфигурации для каждого из соответствующих интерфейсов и реализаций.

В результате у нас будет файл конфигурации с именем com.foreach.autoservice.TranslationService. Этот файл содержит полные имена двух поставщиков:

com.foreach.autoservice.BingTranslationServiceProvider
com.foreach.autoservice.GoogleTranslationServiceProvider

3.3. @AutoService в действии

Теперь все готово. Загрузим провайдеров через ServiceLoader :

ServiceLoader<TranslationService> loader = ServiceLoader.load(TranslationService.class);

ServiceLoader загрузит каждого поставщика, определенного в файле конфигурации.

Давайте проверим количество загруженных провайдеров:

long count = StreamSupport.stream(loader.spliterator(), false).count();
assertEquals(2, count);

Другими словами, ServiceLoader загрузил все экземпляры провайдера. Поэтому наша задача выбрать одного из них.

Итак, теперь давайте выберем одного из провайдеров, а затем вызовем сервисный метод, чтобы увидеть, работает ли загрузчик должным образом:

TranslationService googleService = StreamSupport.stream(loader.spliterator(), false)
.filter(p -> p.getClass().getSimpleName().equals("GoogleTranslationServiceProvider"))
.findFirst()
.get();

String message = "message";

assertEquals(message + " (translated by Google)", googleService.translate(message, null, null));

4. Вывод

В этой статье мы объяснили библиотеку Google AutoService, а также попрактиковались на простом примере.

Google AutoService — полезная, но простая библиотека генератора исходного кода. Это избавляет нас от создания и редактирования файлов конфигурации поставщика услуг . Это также гарантирует, что не будет никаких неправильно написанных или неправильно расположенных файлов.

Исходный код этого руководства, как обычно , доступен в проекте GitHub .