Как исключить свойство из Lombok builder?

у меня есть класс, называемый "XYZClientWrapper", который имеет следующую структуру:

@Builder
XYZClientWrapper{
    String name;
    String domain;
    XYZClient client;
}

что я не хочу, чтобы функция сборки создавалась для свойства XYZClient client

поддерживает ли Ломбок такой вариант использования?

4 ответов


Да, вы можете разместить @Builder в конструкторе или статическом (Заводском) методе, содержащем только нужные поля.

раскрытие информации: я разработчик Ломбок.


альтернативно, я узнал, что маркировка поля как финал, static или статические заключительные поручает @Builder игнорировать это поле.

@Builder
public class MyClass {
   private String myField;

   private final String excludeThisField = "bar";
}

Ломбок 1.16.10


Я обнаружил, что мне удалось реализовать "оболочку" класса static Builder, добавить метод, который я хочу скрыть с помощью модификатора частного доступа, и он больше не доступен в построителе. Точно так же я могу добавить пользовательские методы в builder.

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

}

создайте построитель в коде и добавьте частный сеттер для своего свойства.

@Builder
XYZClientWrapper{
    String name;
    String domain;
    XYZClient client;

    public static class XYZClientWrapperBuilder {
        private XYZClientWrapperBuilder client(XYZClient client) { return this; }
    }
}