有沒有辦法公開在@EmbeddedIdto 中定義的屬性@SuperBuilder?
// Composite id class
@Data
@Builder(builderMethodName = "having")
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class TheId {
@Column(name = "name", insertable = false)
private String name;
@Column(name = "description", insertable = false)
private String description;
}
// Base entity class
@SuperBuilder
@Getter
@Immutable
@MappedSuperclass
@AllArgsConstructor
@NoArgsConstructor
public class BaseEntity implements Serializable {
@Delegate
@EmbeddedId
private TheId id;
@Column(name = "long_description", insertable = false)
private String longDescription;
}
// Concreate entity over database view
@Entity
@Table(name = "view_number_1")
@Getter
@Setter
@Immutable
@AllArgsConstructor(staticName = "of")
@SuperBuilder(builderMethodName = "having")
public class ConcreteEntity1 extends BaseEntity {}
我希望能夠撰寫這樣的代碼:
ConcreateEntity1.having()
.name("the name")
.description("something")
.longDescription("akjsbdkasbd")
.build();
代替
ConcreateEntity1.having()
.id(TheId.having()
.name("the name")
.description("something")
.build())
.longDescription("akjsbdkasbd")
.build();
整個概念背后的原因:同名列存在于多個視圖中,因此為所有視圖使用一個基類是合乎邏輯的。雖然物體本身是不可變的(基于 db 視圖),但我想builder在測驗中使用,這就是為什么我想像上面一樣使用它們。
uj5u.com熱心網友回復:
沒有自動將委托插入@(Super)Builder. 但是,如果您的委托類(TheId在本例中)不包含太多欄位,您可以手動將相應的 setter 方法添加到構建器類中。只需添加正確的構建器類頭,將您的代碼放入其中,Lombok 將添加您未手動撰寫的所有剩余代碼。
誠然,這有點棘手。@SuperBuilder生成的代碼相當復雜,您不想添加太多手動的東西,因為您想保留 Lombok 的優點:如果您更改了帶注釋的類中的某些內容,您將不想重寫所有手動方法。因此,該解決方案試圖以犧牲一點性能/記憶體為代價來保持大部分自動化。
@SuperBuilder(builderMethodName = "having")
public class BaseEntity {
@Delegate
private TheId id;
private String longDescription;
public static abstract class BaseEntityBuilder<C extends BaseEntity, B extends BaseEntityBuilder<C, B>> {
private TheId.TheIdBuilder theIdBuilder = TheId.having();
// Manually implement all delegations.
public B name(String name) {
theIdBuilder.name(name);
// Instantiating every time you call the setter is not optimal,
// but better than manually writing the constructor.
id = theIdBuilder.build();
return self();
}
public B description(String description) {
theIdBuilder.description(description);
id = theIdBuilder.build();
return self();
}
// Make this method invisible.
@SuppressWarnings("unused")
private B id() {
return self();
}
}
}
這值得么?這是一個品味問題,它在多大程度上提高了構建器在您的案例中的適用性/可用性/可讀性。
uj5u.com熱心網友回復:
由于您在 id 中使用了 @Delegate 注釋,因此您應該能夠直接從 BaseEntity 類設定/獲取 TheId 欄位。
你可以在這里閱讀更多關于它的資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/343380.html
