Генерация equals / hashcode / toString с использованием аннотации - PullRequest
8 голосов
/ 29 марта 2010

Мне кажется, я где-то читал людей, генерирующих методы equals / hashcode / toString во время компиляции (используя APT), определяя, какие поля должны быть частью теста hash / равенства. Я не мог найти ничего подобного в Интернете (возможно, мне это приснилось?) ...

Это можно сделать так:

public class Person {
  @Id @GeneratedValue private Integer id;

  @Identity private String firstName, lastName;
  @Identity private Date dateOfBirth;

  //...
}

Для сущности (поэтому мы хотим исключить некоторые поля, например идентификатор).

Или как класс случая scala, т.е. объект значения:

@ValueObject
public class Color {
  private int red, green, blue;
}

Мало того, что файл становится более читабельным и более простым для записи, он также помогает гарантировать, что все атрибуты являются частью хеш-кода equals / hashcode (в случае, если вы добавите другой атрибут позже, без соответствующего обновления методов). *

Я слышал, что APT не очень хорошо поддерживается в IDE, но я не считаю это серьезной проблемой. В конце концов, тесты в основном выполняются серверами непрерывной интеграции.

Есть идеи, если это уже сделано, а если нет, то почему? Спасибо

Ответы [ 3 ]

16 голосов
/ 29 марта 2010

Я использую Project Lombok для этого.

2 голосов
/ 05 мая 2010

Хотя Pojomatic не выполняет манипуляцию байт-кодом во время компиляции, он поддерживает простое создание методов equals, hashCode и toString, используя аннотации для настройки их поведения.

1 голос
/ 23 апреля 2015

Решение Google в библиотеке AutoValue: https://github.com/google/auto/tree/master/value использует аннотацию @AutoValue + генерацию источников перед компиляцией.

Несколько конкурирующих решений обсуждаются в следующей презентации: https://docs.google.com/presentation/d/14u_h-lMn7f1rXE1nDiLX0azS3IkgjGl5uxp5jGJ75RE/edit

...