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

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

下面的课程(非常底部)让我觉得自己的模糊和温暖,因为它很好地重用了现有的代码。 一个问题类型擦除。

public void clawBack(Collection financeRequestList) public void clawBack(Collection commissionTrnsList) 

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

 Collection --> Collection Collection --> Collection 

所以eclipse抱怨说:
方法clawBack(Collection)具有与CommissionFacade类型中的另一种方法相同的擦除clawBack(Collection)

有没有重构这个的建议,以便它仍然是一个优秀的解决方案,可以很好地重用代码?


 public class CommissionFacade { /********FINANCE REQUESTS****************/ public void clawBack(FinanceRequest financeRequest) { Collection commTrnsList = financeRequest.getCommissionTrnsList(); this.clawBack(commTrnsList); } public void clawBack(Collection financeRequestList) { for(FinanceRequest finReq : financeRequestList) { this.clawBack(finReq); } } /********COMMISSION TRANSACTIOS****************/ public void clawBack(CommissionTrns commissionTrns) { //Do clawback for single CommissionTrns } public void clawBack(Collection commissionTrnsList) { for(CommissionTrns commTrn : commissionTrnsList) { this.clawBack(commTrn); } } } 

重命名方法,或使用多态:使用接口,然后将回写代码放在对象本身,或使用双重调度(取决于您的设计范例和品味)。

使用对象中的代码:

 public interface Clawbackable{ void clawBack() } public class CommissionFacade { public  void clawBack(Collection 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方法,并在处理程序上根据类型调用适当的方法。

我认为你最好的选择是简单地命名方法。

 public void clawBackFinReqs(Collection financeRequestList) { } public void clawBackComTrans(Collection commissionTrnsList) { } 

事实上,这并不算太糟糕,因为你没有得到任何额外的东西。

请记住,JVM 不会决定在运行时调用哪个方法。 与虚拟方法/方法相反, 重写方法的重写在编译时完成。 关于方法重载的Java教程甚至指出“应该谨慎使用重载方法……”