some - lombok java constructor example
¿Cómo excluir la propiedad del constructor Lombok? (4)
Alternativamente, descubrí que marcar un campo como final , estático o final estático le @Builder
a @Builder
que ignore este campo.
@Builder
public class MyClass {
private String myField;
private final String excludeThisField = "bar";
}
Lombok 1.16.10
Tengo una clase llamada como "XYZClientWrapper", que tiene la siguiente estructura:
@Builder
XYZClientWrapper{
String name;
String domain;
XYZClient client;
}
No quiero que se genere una función de compilación para la propiedad XYZClient client
¿Lombok apoya tal caso de uso?
Cree el generador en código y agregue un setter privado para su propiedad.
@Builder
XYZClientWrapper{
String name;
String domain;
XYZClient client;
public static class XYZClientWrapperBuilder {
private XYZClientWrapperBuilder client(XYZClient client) { return this; }
}
}
Descubrí que pude implementar un "shell" de la clase de Generador estático, agregar el método que quiero ocultar con un modificador de acceso privado y ya no se puede acceder al mismo en el constructor. Del mismo modo, también puedo agregar métodos personalizados al constructor.
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;
}
}
}
Sí, puede colocar @Builder en un método constructor o estático (de fábrica), que contiene solo los campos que desea.
Divulgación: Soy un desarrollador de Lombok.