一尘不染

通用重载(不覆盖)的Java擦除

java

我的域中有FinanceRequests和CommisionTransactions。如果我有一个FinanceRequests列表,则每个FinanceRequest可能包含多个需要撤回的CommisionTransactions。不用担心这是怎么做到的。

下面的类(非常底层)使我感到模糊不清,因为它简洁,可以很好地重用现有代码。一个问题类型擦除。

public void clawBack(Collection<FinanceRequest> financeRequestList)  
public void clawBack(Collection<CommissionTrns> commissionTrnsList)

它们在擦除后具有相同的签名,即:

Collection<FinanceRequest> --> Collection<Object>  
Collection<CommissionTrns> --> Collection<Object>

因此,eclipse抱怨:
方法clawBack(Collection)具有与类型CommissionFacade中的另一个方法相同的擦除clawBack(Collection)。

有什么建议可以对其进行重组,使其仍然是可以很好地重用代码的优雅解决方案?


public class CommissionFacade
{
    /********FINANCE REQUESTS****************/
    public void clawBack(FinanceRequest financeRequest)
    {
        Collection<CommissionTrns> commTrnsList = financeRequest.getCommissionTrnsList();           
        this.clawBack(commTrnsList);
    }

    public void clawBack(Collection<FinanceRequest> financeRequestList)
    {
        for(FinanceRequest finReq : financeRequestList) 
        {
            this.clawBack(finReq);
        }           
    }

    /********COMMISSION TRANSACTIOS****************/
    public void clawBack(CommissionTrns commissionTrns)
    {
        //Do clawback for single CommissionTrns         
    }

    public void clawBack(Collection<CommissionTrns> commissionTrnsList)
    {
        for(CommissionTrns commTrn : commissionTrnsList) 
        {
            this.clawBack(commTrn);
        }
    }

}

阅读 212

收藏
2020-09-08

共1个答案

一尘不染

重命名方法,或使用多态性:使用接口,然后将clawback代码放入对象本身,或使用两次分派(取决于您的设计范例和口味)。

使用对象中的代码将是:

public interface Clawbackable{
    void clawBack()
}


public class CommissionFacade
{

    public <T extends Clawbackable> void clawBack(Collection<T> objects)
    {
        for(T object: objects) 
        {
            object.clawBack();
        }           
    }
}

public class CommissionTrns implements Clawbackable {

    public void clawback(){
       // do clawback for commissions
    }
}

public class FinanceRequest implements Clawbackable {

    public void clawBack(){
      // do clwaback for FinanceRequest
    }

}

我更喜欢这种方法,因为我相信您的域应该包含您的逻辑;但我并不完全了解您的确切意愿,因此请您自行决定。

使用双重调度,您可以将“ ClawbackHandler”传递给clawback方法,并在处理程序上根据类型调用适当的方法。

2020-09-08