我的域名中有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>
所以日食抱怨说:
方法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);
}
}
}
答案 0 :(得分:13)
重命名方法,或者使用多态:使用接口,然后将回写代码放在对象本身中,或者使用双重调度(取决于您的设计范例和品味)。
使用对象中的代码:
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方法,并在处理程序上根据类型调用适当的方法。
答案 1 :(得分:4)
我认为你最好的选择就是简单地命名方法。
public void clawBackFinReqs(Collection<FinanceRequest> financeRequestList) {
}
public void clawBackComTrans(Collection<CommissionTrns> commissionTrnsList) {
}
事实上,这并不算太糟糕,因为你没有得到任何额外的东西。
请记住,JVM将不决定在运行时调用哪个方法。与虚方法/方法相反,重写重载方法的解析在编译时完成。 method overloading上的Java教程甚至指出“应该谨慎使用重载方法......”。