【问题标题】:Lombok Builder is not working龙目岛生成器不工作
【发布时间】:2018-06-03 14:04:59
【问题描述】:

我有一个基类

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class FurnitureBillingRequest implements JSONAble<FurnitureBillingRequest> {

    private static final Gson gsonSerializer;

    static {
        gsonSerializer = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
    }

    @Expose
    protected String name;

    @Expose
    protected long date;

    @Expose
    protected String phone;

    @Expose
    protected List<BillItemRO> items;

    @Expose
    protected int totalAmount;

    @Expose
    protected int amountPaid;

    @Expose
    protected String remark;

    @Expose
    protected String address;

    public FurnitureBillingRequest(String name, long date, String phone, int totalAmount,
                                   int amountPaid, String remark, String address) {
        this(name, date, phone, new ArrayList<>(), totalAmount, amountPaid, remark, address);
    }

    public String toJson() {
        return gsonSerializer.toJson(this);
    }

    public FurnitureBillingRequest toObject(String json) {
        return gsonSerializer.fromJson(json, FurnitureBillingRequest.class);
    }

    @Override
    public boolean equals(Object that) {

        if (!(that instanceof FurnitureBillingRequest)) {
            return false;
        }

        FurnitureBillingRequest thatFurnitureBillingRequest = (FurnitureBillingRequest) that;

        if (!StringUtils.equals(this.name, thatFurnitureBillingRequest.name)) return false;

        if (this.date != thatFurnitureBillingRequest.date) return false;

        if (!StringUtils.equals(this.phone, thatFurnitureBillingRequest.phone)) return false;

        if (!this.items.equals(thatFurnitureBillingRequest.items)) return false;

        if (this.totalAmount != thatFurnitureBillingRequest.totalAmount) return false;

        if (this.amountPaid != thatFurnitureBillingRequest.amountPaid) return false;

        return true;
    }
}

还有一个子类扩展如下

@Getter
@Setter
@NoArgsConstructor
public class UpdateBillRequest extends FurnitureBillingRequest {

    private static final Gson gsonSerializer;

    static {
        gsonSerializer = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
    }

    @Expose
    private String uid;

    @Builder
    public UpdateBillRequest(String uid, String name, long date, String phone, List<BillItemRO> items, int totalAmount, int amountPaid, String remark, String address) {
        super(name, date, phone, items, totalAmount, amountPaid, remark, address);
        this.uid = uid;
    }

    public UpdateBillRequest(String uid, String name, long date, String phone, int totalAmount, int amountPaid, String remark, String address) {
        super(name, date, phone, totalAmount, amountPaid, remark, address);
        this.uid = uid;
    }

    public String toJson() {
        return gsonSerializer.toJson(this);
    }

    public FurnitureBillingRequest toObject(String json) {
        return gsonSerializer.fromJson(json, FurnitureBillingRequest.class);
    }
}

我写了一个单元测试来检查json是否创建良好。

public class UpdateBillRequestTest {

    @Test
    public void toJson() {

        UpdateBillRequest request = UpdateBillRequest.builder()
                .date(1234567868L)
                .uid("9i09909-90i90-8u90")
                .name("kuldeep")
                .phone("9535580366")
                .build();

        System.out.println(request.toJson());
    }

    @Test
    public void toObject() {
    }
}

但是当我尝试编译代码时,它最终会出错

[错误] /Users/kuldeep/Work/Repositories/billing/BillingModel/src/main/java/com/tarkshala/services/lambda/model/UpdateBillRequest.java:[24,5] builder() in com. tarkshala.services.lambda.model.UpdateBillRequest 无法覆盖 com.tarkshala.services.lambda.model.FurnitureBillingRequest 中的 builder() [错误] 返回类型 com.tarkshala.services.lambda.model.UpdateBillRequest.UpdateBillRequestBuilder 与 com.tarkshala.services.lambda.model.FurnitureBillingRequest.FurnitureBillingRequestBuilder 不兼容

我不知道出了什么问题?

【问题讨论】:

  • 我猜是因为builder()是定义在超类中的,所以会返回超类的一个实例。您是否尝试过将@Builder 也添加到子类中?
  • 好吧,看来你不能将@Builder 添加到子类中,并且强制转换也不起作用......
  • 那看来是龙目岛的局限了。像这样设计龙目岛有什么特别的原因吗?
  • public FooBuilder builder()Foopublic BarBuilder builder()Bar extends Foo
  • @JohannesKuhn 无法理解您的观点。请详细说明。

标签: java lombok


【解决方案1】:

这是 Java 中的一个限制。尝试编译这段代码:

class Foo {
    public static FooBuilder builder() {
        return new FooBuilder();
    }
}
class Bar extends Foo {
    public static BarBuilder builder() {
        return new BarBuilder();
    }
}
class FooBuilder {
    public Foo build() {
        return new Foo();
    }
}
class BarBuilder {
    public Bar build() {
        return new Bar();
    }
}

经典的构建器模式,但我省略了所有属性。

现在 eclipse 告诉我 Bar.builder() 的“返回类型与 Foo.builder() 不兼容”

您不能有返回类型不兼容的重载方法。这甚至适用于静态方法。

【讨论】:

  • 换句话说,问题在于Bar 扩展了FooBarBuilder 没有扩展FooBuilder(Lombok 创建的也没有),因此类型不兼容。跨度>
  • 是的。虽然可以跟踪来自超类的@Builder 注释,但它也会引入很多复杂性。最好的做法是使用@Builder(builderMethodName="fooBuilder")
猜你喜欢
  • 1970-01-01
  • 2021-03-05
  • 2022-01-19
  • 2017-03-22
  • 1970-01-01
  • 2011-08-31
  • 2017-01-15
  • 2018-04-25
  • 2016-06-20
相关资源
最近更新 更多