Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为2个不同的类消除util类上的重复项_Java_Spring Boot_Intellij Idea_Lombok - Fatal编程技术网

Java 如何为2个不同的类消除util类上的重复项

Java 如何为2个不同的类消除util类上的重复项,java,spring-boot,intellij-idea,lombok,Java,Spring Boot,Intellij Idea,Lombok,我声明了两个类,它们具有相同的成员,但由于某些原因而分离。我实现了一个util类,将这两个类转换为同一个类,如下所示 @Data @Builder public class VO1 { private int id; private String value1; private String value2; ... private String value20; } @Data @Builder public class VO2 { private int id;

我声明了两个类,它们具有相同的成员,但由于某些原因而分离。我实现了一个util类,将这两个类转换为同一个类,如下所示

@Data
@Builder
public class VO1 {
  private int id;
  private String value1;
  private String value2;
  ...
  private String value20;
}

@Data
@Builder
public class VO2 {
  private int id;
  private String value1;
  private String value2;
  ...
  private String value20;
}

@Data
@Builder
public class DomainEntity {
  private int id;
  private String value1;
  private String value2;
  ...
  private String value15;
}

public class Converter {
  public static DomainEntity fromVO1(VO1 vo1) {
    return DomainEntity.builder.id(vo1.getId())
             .value1(vo1.getValue1())
             .value2(vo1.getValue2())
             ...
             .value15(vo1.getValue15())
             .build();
  }

  public static DomainEntity fromVO2(VO2 vo2) {
    return DomainEntity.builder.id(vo2.getId())
             .value1(vo2.getValue1())
             .value2(vo2.getValue2())
             ...
             .value15(vo2.getValue15())
             .build();
  }
}
现在我在“Converter”中有重复的代码,我想消除它们。当然我知道我可以使用继承来删除它。然而,我还想使用“Lombok”,因为这些类有很多属性。而使用继承会使使用“Lombok”更麻烦。有人知道解决这种情况的优雅方法吗


谢谢。

您需要为所有值创建一个带有getter的接口,然后两个值对象都应该实现它。然后在Converter中,您可以在一个方法中使用对该接口的引用,该方法可重复使用两次。

我尝试了使用继承的示例,我不觉得代码变得更混乱,我是否遗漏了什么

对于继承,您可以使用实验@SuperBuilder

       package lombok;

        @Getter
        @Setter
        @SuperBuilder
        public class BaseVO {


            private String s1;
            private String s2;
            private String s3;
            private String s4;
            private String s5;
            private String s6;
            private String s7;
            private String s8;
            private String s9;

        }


        package lombok;

        @Getter
        @Setter
        @SuperBuilder
        public class VO1 extends BaseVO{

            private String vo1Specific;
        }


        package lombok;

        @Getter
        @Setter
        @SuperBuilder
        public class VO2 extends BaseVO {

            private String vo2Specific;
        }

        package lombok;

        @Builder
        @ToString
        public class DomainEntity {

            private String s1;
            private String s2;
            private String s3;
            private String s4;
            private String s5;
            private String s6;
            private String s7;
            private String s8;
            private String s9;
            private String specific;

        }


package lombok;

import lombok.DomainEntity.DomainEntityBuilder;

public class Converter {

    public static <T extends BaseVO> DomainEntity fromVO(T basevo) {

        DomainEntityBuilder builder = DomainEntity.builder();
        builder.s1(basevo.getS1()).s2(basevo.getS2()).s3(basevo.getS3());

        if (basevo instanceof VO1) {
            VO1 vo1 = (VO1) basevo;
            builder.specific(vo1.getVo1Specific());

        }

        if (basevo instanceof VO2) {
            VO2 vo1 = (VO2) basevo;
            builder.specific(vo1.getVo2Specific());

        }

        return builder.build();

    }

}

        package lombok;

        public class App {

            public static void main(String[] args) {

            VO1 vo1 = VO1.builder().s1("VO1S1").vo1Specific("VO1 specific property").build();

            VO2 vo2 = VO2.builder().s1("VO2S1").vo2Specific("VO2 specific property").build();

            DomainEntity d1 = Converter.<VO1>fromVO(vo1);
            System.out.println(" d1 " + d1);
            DomainEntity d2 = Converter.<VO2>fromVO(vo2);

            System.out.println(" d2 " + d2);

            }

        }
lombok包装;
@吸气剂
@塞特
@超级建筑商
公共类BaseVO{
私有字符串s1;
私有字符串s2;
私有字符串s3;
私有字符串s4;
私有字符串s5;
私人字符串s6;
私有字符串s7;
私有字符串s8;
私有字符串s9;
}
龙目岛;
@吸气剂
@塞特
@超级建筑商
公共类VO1扩展了BaseVO{
私有字符串vo1Specific;
}
龙目岛;
@吸气剂
@塞特
@超级建筑商
公共类VO2扩展了BaseVO{
私有字符串vo2Specific;
}
龙目岛;
@建筑商
@托斯特林
公共类域实体{
私有字符串s1;
私有字符串s2;
私有字符串s3;
私有字符串s4;
私有字符串s5;
私人字符串s6;
私有字符串s7;
私有字符串s8;
私有字符串s9;
专用字符串专用;
}
龙目岛;
导入lombok.DomainEntity.DomainEntityBuilder;
公共类转换器{
来自VO的公共静态域实体(T basevo){
DomainEntityBuilder=DomainEntity.builder();
builder.s1(basevo.getS1()).s2(basevo.getS2()).s3(basevo.getS3());
if(VO1的基本VO实例){
VO1 VO1=(VO1)basevo;
builder.specific(vo1.getVo1Specific());
}
if(VO2的基本VO实例){
VO2 vo1=(VO2)basevo;
builder.specific(vo1.getVo2Specific());
}
返回builder.build();
}
}
龙目岛;
公共类应用程序{
公共静态void main(字符串[]args){
VO1 VO1=VO1.builder().s1(“VO1S1”).vo1Specific(“VO1特定属性”).build();
VO2 VO2=VO2.builder().s1(“VO2S1”).VO2Sspecific(“VO2特定属性”).build();
域实体d1=转换器.fromVO(vo1);
系统输出打印项次(“d1”+d1);
DomainEntity d2=Converter.fromVO(vo2);
系统输出打印项次(“d2”+d2);
}
}

谢谢你的建议,我知道我可以用interface实现,但我不想自己编写所有getter和setter,这就是我使用Lombok的原因。所以我在寻找一种优雅的方法。你能解释一下使用接口时的messier部分吗,你可以在转换器类中使用接口+泛型和on方法使用Lombok继承,例如使用builder,我需要用所有参数声明构造函数,还需要重命名生成器,这是我不想做的。我不认为这会使代码更混乱,我已经尝试过,使用继承,我将我的代码作为答案发布,因为注释不会显示代码的有效性。然而,我认为您缺少VO1和VO2上的“builder”,因为我需要将DomainEntity转换为VO1或VO2,它们也需要有builder。但是如果他们使用BASEVO作为超类,他们不能只使用'@Builder'注释。我需要用所有参数编写构造函数,并将“builder”重命名为不与BASEVO的builder重复。这破坏了使用lombok的目的,而不是编写样板代码。我现在明白了,我已经修改了我的示例,也许你可以使用实验性的@SuperBuilderI。我已经使用@SuperBuilderYes修改了我的示例,我试过了。不幸的是intellij还不支持@superbuilder。所以我在寻找另一种可以通过不同设计模式或其他方式实现的方法。是的,Intellij不支持这一点,但我认为IDE不应该成为您设计决策的决定因素,请切换到STS或eclipse。