java - 当我们使用 lombok builder 有继承关系时,如何构建一个对象?

标签 java inheritance lombok

在我的项目中,我使用 lombok 来避免为类编写 getter 和 setter。 此外,我正在使用 lombok.Builder 构建一个对象,而不是编写 new Object() 然后设置所有值。

但是当我们有继承关系时,当我们想使用 lombok builder 构造子对象时,我得不到父字段。

例如:

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class Parent{
  private String nationality;
  .
  .
  // more columns
}

子类应该是这样的:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class Child extends Parent{
   private String firstName;
   private String lastName;
   .
   .
}

在我的测试类中,我需要构建子对象

public class Test{

 public void testMethod(){
   Child child = Child.builder()
            .firstName("Rakesh")
            .lastName("SS")
            .nationality("some text")// I am not able to set nationality               
            .build();
 }


}

请告诉我,在 lombok 中有什么方法可以处理这种情况。

最佳答案

@Builder 无法确定您希望公开哪些 Parent 字段。

@Builder 放在类上时,只有在该类上显式声明的字段才会添加到 *Builder

@Builder 放在静态方法或构造函数上时,生成的 *Builder 将为每个参数提供一个方法。

此外,如果您使用的是 @Builder,那么是否可以安全地假设至少 Child 是不可变的?

我提供了两个例子,一个是 Parent 是可变的而 Child 是不可变的,另一个是 ParentChild code> 是不可变的。

不可变父子

import static org.junit.Assert.*;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.Value;
import lombok.experimental.NonFinal;

import org.junit.Test;

public class So32989562ValueTest {

    @Value
    @NonFinal
    public static class Parent {

        protected final String nationality;

    }

    @Value
    @ToString(callSuper = true)
    @EqualsAndHashCode(callSuper = true)
    public static class Child extends Parent {

        private final String firstName;

        private final String lastName;

        @Builder(toBuilder = true)
        private Child(String nationality, String firstName, String lastName) {
            super(nationality);
            this.firstName = firstName;
            this.lastName = lastName;
        }
    }

    @Test
    public void testChildBuilder() {

        String expectedFirstName = "Jeff";
        String expectedLastName = "Maxwell";
        String expectedNationality = "USA";

        Child result = Child.builder()
            .firstName(expectedFirstName)
            .lastName(expectedLastName)
            .nationality(expectedNationality)
            .build();

        assertEquals(result.toString(), expectedFirstName, result.getFirstName());
        assertEquals(result.toString(), expectedLastName, result.getLastName());
        assertEquals(result.toString(), expectedNationality, result.getNationality());
    }
}

可变父级,不可变子级:

import static org.junit.Assert.*;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.Value;

import org.junit.Test;

public class So32989562DataTest {

    @Data
    public static class Parent {

        protected String nationality;

    }

    @Value
    @ToString(callSuper = true)
    @EqualsAndHashCode(callSuper = true)
    public static class Child extends Parent {

        private final String firstName;

        private final String lastName;

        @Builder(toBuilder = true)
        private Child(String nationality, String firstName, String lastName) {
            this.setNationality(nationality);
            this.firstName = firstName;
            this.lastName = lastName;
        }
    }

    @Test
    public void testChildBuilder() {

        String expectedFirstName = "Jeff";
        String expectedLastName = "Maxwell";
        String expectedNationality = "USA";

        Child result = Child.builder()
            .firstName(expectedFirstName)
            .lastName(expectedLastName)
            .nationality(expectedNationality)
            .build();

        assertEquals(result.toString(), expectedFirstName, result.getFirstName());
        assertEquals(result.toString(), expectedLastName, result.getLastName());
        assertEquals(result.toString(), expectedNationality, result.getNationality());
    }
}

关于java - 当我们使用 lombok builder 有继承关系时,如何构建一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32989562/

相关文章:

java - MapStruct:源参数中不存在名为 "updatedDate"的属性。您的意思是 "empty"吗?

java - 多线程无法正常工作

c++ - CUDA 5.5 nvlink undefined reference (继承)

java - 当抽象类具有 Final 字段时,lombok @Data 提示 "lombok needs a default constructor in the base class"

java - Lombok 或 Java 'var' 有用的用例

java - VLCJ/libvlc 跨平台库路径

java - 我正在尝试测试封装,如果我调用 new Object 来测试是否计数?

java - 如何在 Java 的实现类中的抽象类中实现抽象类?

java - 希望在传递给父构造函数之前初始化成员

maven - Mapstruct 不使用 Lombok 定义的构建器