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

<!-Est-ce que Lombok supporte un tel cas d'utilisation?

26
demandé sur pirho 2015-06-08 22:38:41

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.

54
répondu Roel Spilker 2015-06-09 07:42:37

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

4
répondu Stephan 2016-10-07 15:01:07

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;
        }
    }

}
3
répondu Richard Collette 2018-01-02 04:00:21

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; }
    }
}
2
répondu Bill H 2017-06-06 16:17:54