编写具有公共字段的 pojo 的最佳方式
Best way to write pojos that can have common fields
我目前正在制作一项服务,其中有很多 public API。并且响应和请求对象有很多重叠。所以,我在想有没有一种方法可以概括 request/response 对象的 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。问题是 request/response 对象中有很多相似性(重叠字段)。
您的解决方案可能是继承:创建具有重叠字段的父抽象对象类型,并让请求和响应对象扩展它并指定它们需要的任何额外(唯一)字段。
继承
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;
}
您也可以使用组合来解决这个问题:创建一个具有重叠字段的对象类型,并将该对象作为 Request/Response 类型的子对象包含在内:
作文
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;
}
每种方法都各有利弊,这在本论坛和其他论坛上得到了广泛讨论。然而,这些是处理此类问题的两种标准方法。
这实际上取决于您要实现的目标。我不认为重复字段是一个大问题,但你给出了一个抽象的用例,而不是一个我可以理解你想要实现的目标的真实世界情况。
也许您想将您的@Data 对象传递给相同的服务?在这种情况下,您可能希望使用接口,因为 class 可以实现多个接口。
例如
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());
}
}
我目前正在制作一项服务,其中有很多 public API。并且响应和请求对象有很多重叠。所以,我在想有没有一种方法可以概括 request/response 对象的 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。问题是 request/response 对象中有很多相似性(重叠字段)。
您的解决方案可能是继承:创建具有重叠字段的父抽象对象类型,并让请求和响应对象扩展它并指定它们需要的任何额外(唯一)字段。
继承
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;
}
您也可以使用组合来解决这个问题:创建一个具有重叠字段的对象类型,并将该对象作为 Request/Response 类型的子对象包含在内:
作文
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;
}
每种方法都各有利弊,这在本论坛和其他论坛上得到了广泛讨论。然而,这些是处理此类问题的两种标准方法。
这实际上取决于您要实现的目标。我不认为重复字段是一个大问题,但你给出了一个抽象的用例,而不是一个我可以理解你想要实现的目标的真实世界情况。
也许您想将您的@Data 对象传递给相同的服务?在这种情况下,您可能希望使用接口,因为 class 可以实现多个接口。
例如
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());
}
}