は、フィードバックとジョンのanswerに基づいて
を更新しました私はもはや@Tolerate
または@Data
を使用し、代わりに私たちはアクセサとミューテーターを作成するための答えを更新しました@Getter
と@Setter
でデフォルトのコンストラクタを@NoArgsConstructor
で作成し、最後に@AllArgsConstructor
でビルダーが必要とするすべてのargsコンストラクタを作成します。
ビルダーパターンを使用したいので、コンストラクタとミューテータのメソッドの可視性を制限したいと思います。 package private
の可視性を@NoArgsConstructor
と@AllArgsConstructor
アノテーションのaccess
属性と@Setter
アノテーションのvalue
属性を使用して設定しました。
重要
適切toString
、equals
、そしてhashCode
を上書きすることを忘れないでください。 詳細については、ヴラッド・ミホールセアことにより、以下の記事を参照してください:@Tolerate
と@Data
を使用して
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;
/*
* IMPORTANT:
* Set toString, equals, and hashCode as described in these
* documents:
* - https://vladmihalcea.com/the-best-way-to-implement-equals-hashcode-and-tostring-with-jpa-and-hibernate/
* - https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/
* - https://vladmihalcea.com/hibernate-facts-equals-and-hashcode/
*/
}
/**
* Test person builder.
*/
@Test
public void testPersonBuilder() {
final Long expectedId = new Random().nextLong();
final Person fromBuilder = Person.builder()
.id(expectedId)
.build();
assertEquals(expectedId, fromBuilder.getId());
}
/**
* Test person constructor.
*/
@Test
public void testPersonConstructor() {
final Long expectedId = new Random().nextLong();
final Person fromNoArgConstructor = new Person();
fromNoArgConstructor.setId(expectedId);
assertEquals(expectedId, fromNoArgConstructor.getId());
}
}
旧バージョン:
@Tolerate
を使用すると、noargコンストラクタを追加できます。
ビルダーパターンを使用したいので、セッターメソッドの可視性を制御したいと思っています。
@Data
アノテーションは、生成されたセッターをpublic
とし、@Setter(value = AccessLevel.PROTECTED)
を適用すると、protected
となります。
toString
、equals
、およびhashCode
を正しく上書きすることを覚えておいてください。 詳細については、ヴラッド・ミホールセアことにより、以下の記事を参照してください:
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() {}
/* IMPORTANT:
Override toString, equals, and hashCode as described in these
documents:
- https://vladmihalcea.com/the-best-way-to-implement-equals-hashcode-and-tostring-with-jpa-and-hibernate/
- https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/
- https://vladmihalcea.com/hibernate-facts-equals-and-hashcode/
*/
}
@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' https://projectlombok.org/api/lombok/NoArgsConstructor.html –
追加してみてください引数なしのコンストラクタ.AFAIK、' @ Builder'あなたのno argsコンストラクタをオーバーライドしません –
ええ、@Idは必須フィールドです。 NoArgsはそれをカットするつもりはない – krzakov