代码之家  ›  专栏  ›  技术社区  ›  Crosk Cool

编写具有公共字段的POJO的最佳方法

  •  3
  • Crosk Cool  · 技术社区  · 7 年前

    我目前正在做一个服务,其中有很多公共API。响应和请求对象重叠很多。所以,我在想,有没有一种方法可以将pojo创建推广到请求/响应对象。 有时,响应对象与请求对象相同,但有一个或两个额外字段。

    让我给你举个例子。

    @Data
    public class Request {
        private A objA;
        private B objB;
    }
    
    @Data
    public class Response {
        private A objA;
        private B objB;
        private C objC;
    }
    
    @Data
    public class A {
        private D objD;
    }
    
    @Data
    public class B {
        private String sB; 
        private E obje;
    }
    
    @Data
    public class C {
        private String sC;
    }
    

    类似地,D和E也是POJO。问题是,在请求/响应对象中有很多相似性(重叠字段)。

    2 回复  |  直到 7 年前
        1
  •  7
  •   java-addict301    7 年前

    您的解决方案可能是继承:创建一个具有重叠字段的父抽象对象类型,让请求和响应对象对其进行扩展,并指定它们需要的任何额外(唯一)字段。

    继承性

    public abstract class Common {
      private String overlapfield1;
      private String overlapfield2
    }
    
    public class Request extends Common {
      private String requestField1;
      private String requestField2;
    }
    
    public class Response extends Common {
      private String responseField1;
      private String responseField2;
    }
    

    您也可以使用组合来实现这一点:创建一个具有重叠字段的对象类型,并将该对象作为请求/响应类型的子对象包括在内:

    作文

    public class Common {
      private String overlapfield1;
      private String overlapfield2
    }
    
    public class Request {
      private String requestField1;
      private String requestField2;
      private Common common;
    }
    
    public class Response {
      private String responseField1;
      private String responseField2;
      private Common common;
    }
    

    每种方法都有利弊,在本委员会和其他委员会上都有广泛讨论。然而,这是处理此类问题的两种标准方法。

        2
  •  0
  •   lance-java    7 年前

    这真的取决于你想要实现什么。我不认为重复这些领域是一个大问题,但你给出了一个抽象的用例,而不是一个我可以理解你想要实现什么的真实情况。

    也许您想将@数据对象传递给相同的服务?在这种情况下,您可能希望使用接口,因为一个类可以实现多个接口。

    public interface AContiner {
        A getA();
        void setA(A a);
    }
    
    public interface BContiner {
        B getB();
        void setB(B b);
    }
    
    @Data
    public class Bean1 implements AContainer {
        private A a;
    }
    
    @Data
    public class Bean2 implements AContainer, BContainer {
        private A a;
        private B b;
    }
    
    public class MyFantasticService {
        public void doStuffWithA(AContainer data) {
            System.out.println(data.getA());
        }
        public void doStuffWithB(BContainer data) {
            System.out.println(data.getB());
        }
    }