ho scoperto che ero in grado di implementare un "guscio" della classe Builder statica, aggiungere il metodo voglio nascondere con un modificatore di accesso privato, e non è più accessibile nel generatore. Allo stesso modo, posso aggiungere metodi personalizzati al costruttore.
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;
}
}
}
fonte
2017-10-31 06:10:31
Per quanto mi riguarda, grazie per aver rivelato di essere uno sviluppatore di lombok ;-). Questo costruttore o metodo statico (di fabbrica) può essere non pubblico? – markvgti
Sì, potrebbe avere visibilità, incluso 'private'. La divulgazione indica che la risposta o l'opinione potrebbero essere di parte. In questo caso non è rilevante, ma ho preso l'abitudine di aggiungerlo a tutte le mie risposte relative al lombok. –
Mi sono imbattuto in questa domanda e risposta poiché ho in mente la stessa domanda. La soluzione del costruttore non è davvero una buona soluzione nel mio caso. Ho una classe con 29 proprietà (un'entità) e voglio solo che una di esse non sia inclusa nel builder (in effetti: l'id). Non esiste un modo per escludere il meccanismo proprio come in @ToString? Il motivo principale per usare Lombok è evitare il disordine. Un Costruttore con 28 parametri non è quello che voglio vedere. – Staratnight