【问题标题】:Best way to write pojos that can have common fields编写可以具有公共字段的 pojo 的最佳方法
【发布时间】:2017-11-20 16:47:16
【问题描述】:

我目前正在提供一个包含大量公共 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。问题是请求/响应对象中有很多相似之处(重叠字段)。

【问题讨论】:

  • 创建一个由RequestResponse 扩展的通用类。将所有常用字段添加到该类并标记为protected?我不确定这个问题的复杂性在哪里。
  • 使用abstract class,然后在其中放置公共字段
  • 您的问题并不表明他们需要定义一个将由应用程序使用的通用基本类型以及需要父类的模板方法模式。仅仅因为许多类共享相同的字段并不意味着它们需要通过继承绑定在一起。我宁愿把它们分开。

标签: java pojo


【解决方案1】:

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

继承

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】:

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

    也许您想将您的 @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());
        }
    }
    

    【讨论】:

    • 我不确定这是否能解决他的问题。 Request 和 Response 对象仍然必须指定许多重复的字段,无论它们是否包含对这些字段进行操作的方法声明。
    • 我不确定他是否很好地解释了他的问题。查看我更新的评论
    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 2014-01-29
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多