Aktualisiert
Basierend auf dem Feedback und John Antwort habe ich die Antwort auf nicht mehr zu verwenden aktualisiert @Tolerate
oder @Data
stattdessen wir schaffen Zugriffs- und Mutatoren über @Getter
und @Setter
erstellen Sie den Standard - Konstruktor über @NoArgsConstructor
, und schließlich schaffen wir die alle args Konstruktor , dass der Builder erfordert über @AllArgsConstructor
.
Da Sie das Builder-Muster verwenden möchten, stellen Sie sich vor, Sie möchten die Sichtbarkeit der Konstruktor- und Mutator-Methoden einschränken. Um dies zu erreichen setzen wir die Sichtbarkeit package private
über das access
Attribut auf die @NoArgsConstructor
und @AllArgsConstructor
Anmerkungen und das value
Attribut auf der @Setter
Anmerkung.
Wichtig
Denken Sie daran, richtig außer Kraft setzen toString
, equals
und hashCode
. Siehe die folgenden Beiträge von Vlad Mihalcea für Details:
package com.stackoverflow.SO34299054;
import static org.junit.Assert.*;
import java.util.Random;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.junit.Test;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@SuppressWarnings("javadoc")
public class Answer {
@Entity
@Builder(toBuilder = true)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@NoArgsConstructor(access = AccessLevel.PACKAGE)
@Setter(value = AccessLevel.PACKAGE)
@Getter
public static class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
@Test
public void testPersonBuilder() {
final Long expectedId = new Random().nextLong();
final Person fromBuilder = Person.builder()
.id(expectedId)
.build();
assertEquals(expectedId, fromBuilder.getId());
}
@Test
public void testPersonConstructor() {
final Long expectedId = new Random().nextLong();
final Person fromNoArgConstructor = new Person();
fromNoArgConstructor.setId(expectedId);
assertEquals(expectedId, fromNoArgConstructor.getId());
}
}
Alte Version mit @Tolerate
und @Data
:
Verwenden von @Tolerate
funktioniert, um das Hinzufügen eines Noarg-Konstruktors zu ermöglichen.
Da Sie das Builder-Muster verwenden möchten, stellen Sie sich vor, Sie möchten die Sichtbarkeit der Setter-Methoden steuern.
Die @Data
Annotation macht die generierten Setter public
, die Anwendung @Setter(value = AccessLevel.PROTECTED)
auf die Felder macht sie protected
.
Denken Sie daran, richtig außer Kraft setzen toString
, equals
und hashCode
. Siehe die folgenden Beiträge von Vlad Mihalcea für Details:
package lombok.javac.handlers.stackoverflow;
import static org.junit.Assert.*;
import java.util.Random;
import javax.persistence.GenerationType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Data;
import lombok.Setter;
import lombok.experimental.Tolerate;
import org.junit.Test;
public class So34241718 {
@Builder
@Data
public static class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Setter(value = AccessLevel.PROTECTED)
Long id;
@Tolerate
Person() {}
}
@Test
public void testPersonBuilder() {
Long expectedId = new Random().nextLong();
final Person fromBuilder = Person.builder()
.id(expectedId)
.build();
assertEquals(expectedId, fromBuilder.getId());
}
@Test
public void testPersonConstructor() {
Long expectedId = new Random().nextLong();
final Person fromNoArgConstructor = new Person();
fromNoArgConstructor .setId(expectedId);
assertEquals(expectedId, fromNoArgConstructor.getId());
}
}
@NoArgsConstructor
projectlombok.org/api/lombok/NoArgsConstructor.html