首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何消除两个不同类在util类上的重复

如何消除两个不同类在util类上的重复
EN

Stack Overflow用户
提问于 2019-09-23 01:17:41
回答 2查看 315关注 0票数 0

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

代码语言:javascript
复制
@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();
  }
}

现在我有代码副本在‘转换器’,我想消除他们。当然,我知道我可以使用继承来删除它。但是,我也想使用'Lombok',因为这些类有很多属性。而使用继承使得使用“Lombok”变得更加混乱。有谁知道解决这种情况的优雅方法吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-24 07:21:43

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

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

代码语言:javascript
复制
       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);

            }

        }
票数 1
EN

Stack Overflow用户

发布于 2019-09-23 02:03:51

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58054629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档