编写可以拥有共同字段的pojos的最佳方式

时间:2017-11-20 16:47:17

标签: java pojo

我目前正在提供服务,其中有很多公共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也是pojos。问题是请求/响应对象中存在很多相似性(重叠字段)。

2 个答案:

答案 0 :(得分:3)

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

<强>传承

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;
}

您还可以使用合成来处理此问题:创建具有重叠字段的对象类型,并将此对象包含为请求/响应类型的子对象:

<强>组合物

mx.myapp.com
nz.myapp.com
hn.myapp.com

每种方法都有各自的优点和缺点,这些方法在本委员会和其他委员会中得到广泛讨论。然而,这些是处理这种问题的两种标准方法。

答案 1 :(得分:0)

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

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

例如

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());
    }
}