Comment exclure un bien de Lombok builder?
j'ai une classe appelée "XYZClientWrapper" , qui ont la structure suivante:
@Builder
XYZClientWrapper{
String name;
String domain;
XYZClient client;
}
ce que je veux aucune fonction de compilation générée pour la propriété XYZClient client
4 réponses
Oui, vous pouvez placer @Builder sur une méthode constructeur ou statique (usine), contenant juste les champs que vous voulez.
Divulgation: je suis un Lombok développeur.
alternativement, j'ai découvert que marquer un champ comme final,statique ou final statique charge @Builder
pour ignorer ce champ.
@Builder
public class MyClass {
private String myField;
private final String excludeThisField = "bar";
}
Lombok 1.16.10
j'ai trouvé que j'ai pu implémenter un" shell " de la classe statique Builder, ajouter la méthode que je veux cacher avec un modificateur d'accès privé, et il n'est plus accessible dans le builder. De même, je peux ajouter des méthodes pour le constructeur.
package com.something;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import java.time.ZonedDateTime;
@Data
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MyClass{
//The builder will generate a method for this property for us.
private String anotherProperty;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "localDateTime", column = @Column(name = "some_date_local_date_time")),
@AttributeOverride(name = "zoneId", column = @Column(name = "some__date_zone_id"))
})
@Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PRIVATE)
private ZonedDateTimeEmbeddable someDateInternal;
public ZonedDateTime getSomeDate() {
return someDateInternal.toZonedDateTime();
}
public void setSomeDate(ZonedDateTime someDate) {
someDateInternal = new ZonedDateTimeEmbeddable(someDate);
}
public static class MyClassBuilder {
//Prevent direct access to the internal private field by pre-creating builder method with private access.
private MyClassBuilder shipmentDateInternal(ZonedDateTimeEmbeddable zonedDateTimeEmbeddable) {
return this;
}
//Add a builder method because we don't have a field for this Type
public MyClassBuilder someDate(ZonedDateTime someDate) {
someDateInternal = new ZonedDateTimeEmbeddable(someDate);
return this;
}
}
}
créez le constructeur en code et ajoutez un setter privé pour votre propriété.
@Builder
XYZClientWrapper{
String name;
String domain;
XYZClient client;
public static class XYZClientWrapperBuilder {
private XYZClientWrapperBuilder client(XYZClient client) { return this; }
}
}