作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的域中有 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);
}
}
}
最佳答案
要么重命名方法,要么使用多态性:使用接口(interface),然后将回拨代码放在对象本身中,或者使用双分派(dispatch)(取决于您的设计范例和品味)。
对象中的代码将是:
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
}
}
我更喜欢这种方法,因为我相信您的域应该包含您的逻辑;但我不完全了解您的确切愿望,所以我会把它留给您。
使用双重分派(dispatch),您可以将“ClawbackHandler”传递给 clawback 方法,并在处理程序上根据类型调用适当的方法。
关于带有泛型重载的 Java 删除(不是覆盖),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11535206/
我是一名优秀的程序员,十分优秀!