【问题标题】:Lombok @Builder inheritance for 3 ClassesLombok @Builder 继承 3 个类
【发布时间】:2020-08-22 13:59:15
【问题描述】:

这可能是一个初学者的问题,但我很困惑。

我有 3 个班级,如下所示。在这种情况下如何使用 lombok 的 @Builder 注释。

尝试执行以下代码时,我在 C 类中遇到错误。

如果父类 Class B 也有 @Builder 注释,那么 Class C 会起作用吗?

我收到一个错误:- 错误:java:ClassC 中的 builder() 无法隐藏 ClassB 返回类型中的 builder() ClassCBuilder 与 ClassBBuilder 不兼容

C类:

import lombok.Builder;
public class C extends B {
    private String fieldC;

    @Builder
    public C(String fieldC, String fieldB, String fieldA) {
        super(fieldB, String fieldA);
        this.fieldC = fieldC;
    }
}

B类:

import lombok.Builder;
public class B extends A {
    private String fieldB;

    @Builder
    public B(String fieldB, String fieldA) {
        super(fieldA);
        this.fieldB = fieldB;
    }
}

A类:

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
public abstract class A {
    private String fieldA;
}

【问题讨论】:

  • 我想为 C 类扩展 B 类和 B 类扩展抽象 A 类的类生成构建器。这样当我使用 C 类时,我应该可以访问所有 3 个中的所有字段来自构建器的类
  • B 类能够使用 A 类的公共构造函数访问私有字段“fieldA”。是否可以在不公开“fieldA”的情况下让 C 类也访问“fieldA”?
  • 给定的代码工作正常。我不知道为什么我最初收到错误。可能是编译问题

标签: java lombok


【解决方案1】:

@Builder 应该添加到 class 而不是像这样的构造函数:

import lombok.Builder;
@Builder
public class C extends B {
    private String fieldC;

    public C(String fieldC, String fieldB, String fieldA) {
        super(fieldB, String fieldA);
        this.fieldC = fieldC;
    }
}

@Builder 注释导致 lombok 生成内部 Builder 类。在字段或方法中添加 @Builder.Default 之类的内容只会修改构建器方法。请参阅 lombok 的 @Builder 描述页面中的以下示例:

import lombok.Builder;
import lombok.Singular;
import java.util.Set;

@Builder
public class BuilderExample {
    @Builder.Default private long created = System.currentTimeMillis();
    private String name;
    private int age;
    @Singular private Set<String> occupations;
}

使用@Builder 注释的类将自动拥有一个内部类,其名称与外部类类似,但后缀为“Builder”。然后,您可以通过调用来实例化这样的构建器:

MyClass myObject = MyClass.builder().withSomething("abc").build();

【讨论】:

  • 在 C 类构造函数中,我收到 fieldA 具有私有访问权限的错误
  • 那么你应该把它设为protected 而不是私有的。我认为您不能将 setter 指定为设置值的方法,这很奇怪。
  • 嗨,如果子类正在扩展一个也有 @Builder 注释的父类,这会起作用吗?我收到一个错误:- 错误:java:ClassC 中的 builder() 无法隐藏 ClassB 返回类型中的 builder() ClassCBuilder 与 ClassBBuilder 不兼容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 2020-07-18
  • 2021-11-21
  • 2018-10-02
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多