如何重构返回嵌套映射的JAVA方法? 公共映射getServiceInterval( 合同(计费周期和计费周期) { Map returnMap=newhashmap(); List productList=getAllproducts(PCContract); 对于(产品:productList) { 日期计费日期=getBillingDate(产品); createReturnMap( 产品,返回地图, 计费日期,pBillCycle); } 返回地图; }

如何重构返回嵌套映射的JAVA方法? 公共映射getServiceInterval( 合同(计费周期和计费周期) { Map returnMap=newhashmap(); List productList=getAllproducts(PCContract); 对于(产品:productList) { 日期计费日期=getBillingDate(产品); createReturnMap( 产品,返回地图, 计费日期,pBillCycle); } 返回地图; },java,collections,hashmap,refactoring,Java,Collections,Hashmap,Refactoring,我被要求重构此方法(此处简化),因为: 这种复杂类型不应在接口中使用。 此外,这使得代码很难调试。 实现应该隐藏在类中 我不确定重构它是否有意义 你同意重构这个方法值得吗 如果是,您将使用什么方法?如何使调试更容易 谢谢您可以用自己的类替换嵌套映射,例如提供调用方所需方法的服务。此类最有可能使用或扩展映射。然后,签名成为 public Map<product, SortedMap<Date, ServiceInterval>> getServiceInterval(

我被要求重构此方法(此处简化),因为:

这种复杂类型不应在接口中使用。 此外,这使得代码很难调试。 实现应该隐藏在类中

我不确定重构它是否有意义

你同意重构这个方法值得吗

如果是,您将使用什么方法?如何使调试更容易


谢谢

您可以用自己的类替换嵌套映射,例如提供调用方所需方法的服务。此类最有可能使用或扩展映射。然后,签名成为

public Map<product, SortedMap<Date, ServiceInterval>> getServiceInterval(
            Contract pContract, BillCycle pBillCycle)
    {
        Map<product, SortedMap<Date, ServiceInterval>> returnMap = new HashMap<>();

        List<product> productList = getAllproducts(pContract);

        for (product product : productList)
        {
            Date billingDate = getBillingDate(product);

            createReturnMap(
                    product, returnMap,
                    billingDate, pBillCycle);
        }

        return returnMap;
    }
公共地图getServiceInterval(合同PCContract,BillCycle pBillCycle)

它使代码更容易阅读,但是您在代码上花费了开发时间和精力,而很可能没有为代码添加太多功能。如果可以使用附加逻辑扩展服务类,则可能有意义。如果不知道更多细节,真的很难说。

查看提供的示例,我看不出有任何理由使用嵌套映射。正如我从代码中看到的,每个产品只有一个计费日期,所以嵌套映射对于每个产品只有一个元素。为了使事情更简单,只需再创建一个类,其中包含billing date和ServiceInterval,我们将其称为BillingServiceInterval,并从您的方法返回
Map
。希望这对您有所帮助

如果每个产品都有一个日期和一个服务间隔,您可以创建一个简单的bean。该方法将返回您选择的此类bean的集合

public Map<Product, Services> getServiceInterval(Contract pContract, BillCycle pBillCycle)
这是动态编写的伪代码,只是为了展示这一想法:

Map<Product, SortedMap<Date, ServiceInterval>>
public ServiceIntervalByProduct getServiceInterval(
合同(计费周期和计费周期){
ServiceIntervalByProduct returnMap=新ServiceIntervalByProduct();
List productList=getAllproducts(PCContract);
对于(产品:productList)
{
日期计费日期=getBillingDate(产品);
createReturnMap(
产品,返回地图,
计费日期,pBillCycle);
}
返回地图;
}
//第一级包装类
公共类ServiceIntervalsByProduct{
私有地图>地图副产品;
公共作废添加(产品、日期、服务间隔、服务间隔){
//外接程序内部映射
}
公共服务间隔getServiceInterval(产品、日期){
//从内部地图获取
返回mapByProduct.get(产品).getServiceInterval(日期);
}
}
//二级包装类
公共类ServiceIntervalsByDate{
私有分类地图>地图日期;
公共作废添加(日期、服务间隔、服务间隔){
//外接程序内部映射
}
公共服务间隔getServiceInterval(日期){
//从内部地图获取
返回mapByDate.get(日期);
}
}

我在包装器中提供了
add()
方法,但如果您想保护数据修改不受客户端类的影响,可以在构造函数中收集所有需要的数据。

不确定您的要求,但我认为您可能需要
returnMap=createReturnMap(product、billingDate、pBillCycle)。让方法
createReturnMap
处理创建
Map
;很难说看不到整个类。实际上这段代码被简化了,我同意你所说的,但是我真正的任务是去掉getServiceInterval方法中的嵌套映射。我如何替换嵌套映射?@bradimus不能这样做,因为
createReturnMap
实际上并没有创建返回映射,而是添加到它(方法名称不正确)。如果有任何问题,您可以执行
returnMap.put(product,createSortedMap(product,billingDate,pBillCycle))
假设内部映射中的
Date
键是计费日期。不知道
createReturnMap()是什么
事实上是这样,这是一个很大的假设。你是对的。我只是尝试猜测,因为我们没有足够的信息,然后对问题写一条评论,要求澄清。不幸的是,我没有足够的信誉点来做这件事。很抱歉,这段代码被简化了。我只是想说明该方法返回一个嵌套映射和代码审稿人要求我去掉它。这个逻辑中还有几个其他参数。你怎么知道每个产品只有一个
ServiceInterval
?你不知道
createReturnMap()是什么
是的。谢谢这是一个很好的方法,我会尝试一下。我同意你的观点,这种重构需要付出很多努力,但没有很大的好处。欢迎你。实现起来并不困难:)
Map<Product, SortedMap<Date, ServiceInterval>>
public ServiceIntervalByProduct getServiceInterval(
        Contract pContract, BillCycle pBillCycle)  {
    ServiceIntervalByProduct  returnMap = new ServiceIntervalByProduct();

    List<product> productList = getAllproducts(pContract);

    for (product product : productList)
    {
        Date billingDate = getBillingDate(product);

        createReturnMap(
                product, returnMap,
                billingDate, pBillCycle);
    }

    return returnMap;
}

// First level Wrapper class
public class ServiceIntervalsByProduct{

  private Map<Product, ServiceIntervalsByDate>> mapByProduct;   

  public void add(Product product, Date date, ServiceInterval serviceInterval) {
   // add in inner map
  }

 public ServiceInterval getServiceInterval (Product product, Date date){
   // get from inner map
    return mapByProduct.get(product).getServiceInterval (date);    
 }
}


// Second level Wrapper class
public class ServiceIntervalsByDate{
  private  SortedMap<Date, ServiceInterval>> mapByDate;

  public void add(Date date, ServiceInterval serviceInterval){
   // add in inner map    
  }

  public ServiceInterval getServiceInterval (Date date){
   // get from inner map
    return mapByDate.get(date);
   }

}