8 Stimmen

Erzeugen von equals / hashcode / toString mittels Annotation

Ich glaube, ich habe irgendwo gelesen, dass Leute während der Kompilierungszeit (mit APT) Gleichheits-/Hashcode-/ToString-Methoden generieren, indem sie ermitteln, welche Felder Teil des Hash-/Gleichheitstests sein sollten. Ich konnte nichts dergleichen im Web finden (vielleicht habe ich es geträumt?) ...

Das könnte man auch so machen:

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

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

  //...
}

Für eine Entität (wir wollen also einige Felder ausschließen, z. B. die id).

Oder wie ein Scala Fall Klasse d.h. ein Wert Objekt:

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

Dadurch wird die Datei nicht nur lesbarer und einfacher zu schreiben, sondern es wird auch sichergestellt, dass alle Attribute Teil des Gleichheits-/Hashcodes sind (für den Fall, dass Sie später ein weiteres Attribut hinzufügen, ohne die Methoden entsprechend zu aktualisieren).

Ich habe gehört, dass APT in IDE nicht sehr gut unterstützt wird, aber ich würde das nicht als ein großes Problem ansehen. Schließlich werden die Tests hauptsächlich von Continuous Integration Servern ausgeführt.

Wissen Sie, ob dies bereits geschehen ist und wenn nicht, warum? Danke

16voto

Yuri.Bulkin Punkte 1346

Ich benutze Projekt Lombok für diese.

2voto

Ian Robertson Punkte 1250

Während Pojomatic keine Bytecode-Manipulation zur Kompilierzeit durchführt, unterstützt es die einfache Erstellung von equals-, hashCode- und toString-Methoden, wobei Annotationen zur Anpassung ihres Verhaltens verwendet werden können.

1voto

Marek Gregor Punkte 3412

Die Lösung von Google in der Bibliothek AutoValue: https://github.com/google/auto/tree/master/value verwendet die @AutoValue-Anmerkung + Generierung der Quellen vor der Kompilierung.

In der folgenden Präsentation werden mehrere konkurrierende Lösungen erörtert: https://docs.google.com/presentation/d/14u_h-lMn7f1rXE1nDiLX0azS3IkgjGl5uxp5jGJ75RE/edit

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X