【问题标题】:How do I abstract this correctly我如何正确地抽象这个
【发布时间】:2019-10-16 11:29:08
【问题描述】:

我在这里进退两难。

所以,我有这个 Rest API,它充当另一个使用它的 API 和来自外部提供者的 SOAP API 之间的简化代理。

在其中,我有 4 个方法对应于 4 个 Soap 端点,它们将来自 Rest 请求 DTO-s 的数据映射到 Soap 请求 DTO-s。

4 个 Rest 请求 DTO-s 有一个 CommonDto,其中包含所有请求共有的一些对象。

这个常见的 REST 请求 DTO 的某些字段可以为空,如果是这样,我有空检查,所以我根本不设置相应的 SOAP 请求字段,因为这会使 SOAP 请求失败。

这4种方法基本上是这样的:

public RestResponseObject1 method1(RestRequestObject1 rRO1){
   SoapRequestObject1 sRO1= new SoapRequestObject1();

   Object commonField1= rR01.getCommonField1();//Object can be anything, BigDecimal, String, int,etc.
   if(commonField1!=null){
       sRO1.setCommonField1(commonField1);
   }

   BigDecimal commonField2= rR01.getCommonField2();
   if(commonField2!=null){
       sRO1.setCommonField2(commonField2.intValue());
   }

  //etc....

  return Mapper.map(soapService.doSoapMethod1(sRO1);
}

这个方法重复了4次,有不同的RestRequestObjects、RestResponseObjects和SoapRequestObjects,但是它们之间的commonfields类型没有变化。

我的问题是,我怎样才能抽象出 nullchecks,这样我就不会为每个方法重复它们,从而使我的代码更清晰?请注意,我无法对 Soap 请求对象执行任何操作,因为它们是通过 Swagger/OpenApi 自动生成的

【问题讨论】:

  • 所以你的意思是所有soap请求对象类型都没有通用接口或父类?
  • 你也在使用java8或更高版本吗?
  • 是的,是的,没有通用接口,也没有继承的可能性

标签: java oop coding-style


【解决方案1】:

或者在上一个答案的基础上,使其更通用,以便它也适用于其他请求对象

private <T, E> void setIfNotNull(E setterObject, BiConsumer<E, T> setter, T value) {
   if (value != null) {
       setter.accept(setterObject, value);
   }
}

有了这个你现在可以调用

setIfNotNull(sRO1, sRO1::setCommonField1, rR01.getCommonField1());

【讨论】:

    【解决方案2】:

    你可以从一个简单的实用方法开始:

    private static <T> void setIfNotNull(T object, Consumer<T> setter) {
      if (object != null) setter.accept(object);
    }
    

    然后你的主要代码变成:

    setIfNotNull(rR01.getCommonField1(), o -> sRO1.setCommonField1(o));
    setIfNotNull(rR01.getCommonField2(), bd -> sRO1.setCommonField2(bd.intValue()));
    

    【讨论】:

      猜你喜欢
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多