Статьи

Использование генератора кода AutoValue в Eclipse

Мой коллега Мориц из EclipseSource недавно натолкнулся на Google Auto, коллекцию генераторов кода Java. AutoValue является одним из них и генерирует код Java для неизменяемых объектов . Он предоставляет аннотацию и процессор аннотаций для генерации кода Java для объектов с неизменяемыми значениями. Текущая версия помечена RC1, и скоро будет выпущена версия 1.0.

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

1
2
3
4
5
6
7
8
9
@AutoValue
abstract class Person {
  static Person create( String name, int age ) {
    return new AutoValue_Person( name, age );
  }
 
  abstract String name();
  abstract int age();
}

После запуска процессора у вас также будет класс AutoValue_Person, который находится в том же пакете и реализует методы доступа для возврата значений полей. Он также реализует equals, hashCode и toString. Вот как выглядит сгенерированный код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
final class AutoValue_Person extends Person {
  private final String name;
  private final int age;
 
  AutoValue_Person(String name, int age) {
    if (name == null)
      throw new NullPointerException("Null name");
    this.name = name;
    this.age = age;
  }
 
  String name() {
    return name;
  }
  ...
 
  public String toString() {
    ...
  }
 
  public boolean equals(Object o) {
    ...
  }
 
  public int hashCode() {
    ...
  }
}

Как видите, в этом нет никакой магии. Процессор генерирует читаемый и отлаживаемый код без каких-либо зависимостей времени выполнения. Аспекты, такие как обнуляемость, сериализация, пользовательские реализации equals, hashCode и toString и другие могут быть настроены. Перейдите по ссылке в readme проекта для всех деталей.

Мне очень нравится идея маленького инструмента, который делает одно и делает это хорошо. Хорошая доля написания EqualsTester была мотивирована тестированием equals и hashCode для — как вы догадываетесь — объектов с неизменяемыми значениями. Если бы AutoValue была бы тогда, это могло бы сэкономить некоторые усилия. Однако этот инструмент будет иметь ограниченное практическое применение, если он плохо интегрируется в выбранную вами среду разработки.

Интеграция AutoValue в Eclipse

При использовании AutoValue в IDE вы, вероятно, захотите сгенерировать код, как только сохраните исходный файл. Моя IDE — Eclipse, поэтому я предпринял следующие шаги для интеграции процессора аннотаций в Eclipse.

Правила обработки аннотаций в Eclipse должны быть указаны для каждого проекта. Следовательно, первым делом нужно включить обработку аннотаций для проекта, который использует процессор (Свойства проекта> Компилятор Java> Обработка аннотаций). По умолчанию сгенерированный код записывается в отдельную исходную папку (параметр «Сгенерированный исходный каталог»), чтобы его можно было исключить из контроля версий.

Затем я рассказал Eclipse, где найти процессор аннотаций для аннотаций @AutoValue. Процессор упакован вместе с самой аннотацией в auto-value-1.0-rc1.jar. Начиная с этого jar-файла и следуя по его цепочке зависимостей, я получил библиотеки, необходимые для работы процессора (все они доступны в Maven Central):

  • автосервис-1,0-rc1.jar
  • гуавы-16.0.1.jar
  • JSR-305-2.0.3.jar
  • авто-значение-1,0-rc1.jar

кв-завод-путь
Ну, все идет по цене. Тем не менее, добавление этих банок в путь к фабрике достаточно. Процессор (повторно) генерирует код для каждого аннотированного класса @AutoValue в проекте всякий раз, когда я нажимаю Ctrl + S — очень гладко…

Осталось сделать так, чтобы настройки легко использовались другими членами команды. Проблема здесь заключается в том, чтобы разместить банки в месте, переносимом на разных компьютерах разработчиков. Я не нашел другого решения, кроме проверки настроек и ~ 2 МБ файлов jar в хранилище исходного кода. Хотя наличие бинарных файлов в хранилище, безусловно, нежелательно, каждый член команды вытаскивает банки из какого-то места — это так же плохо. Пожалуйста, поделитесь своими мыслями, если вы знаете выход из этой дилеммы.