Стирание Java с общей перегрузкой (без переопределения) - PullRequest
13 голосов
/ 26 августа 2011

У меня есть FinanceRequests и CommisionTransactions в моем домене.Если у меня есть список запросов на финансирование, каждый запрос на финансирование может содержать несколько транзакций CommisionTransaction, которые необходимо вернуть обратно.Не волнуйтесь, как именно это делается.

Класс, приведенный ниже (самый нижний), заставляет меня чувствовать себя нечетко и тепло, так как он является лаконичным и прекрасно использует существующий код.Одна проблема Тип стирания.

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

Они оба имеют одинаковую подпись после стирания, т.е.:

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

Так затмение жалуется, что:
Метод clawBack (Коллекция) имеет одинаковыйerasure clawBack (Collection) как еще один метод в типе CommissionFacade

Есть предложения по его реструктуризации, чтобы оно оставалось элегантным решением, обеспечивающим хорошее повторное использование кода?


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);
        }
    }

}

Ответы [ 2 ]

14 голосов
/ 26 августа 2011

Либо переименуйте методы, либо используйте полиморфизм: используйте интерфейс, а затем либо поместите код возврата в сами объекты, либо используйте двойную диспетчеризацию (в зависимости от вашей парадигмы дизайна и вкуса).

С кодом в объектах, который будет:

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, а в обработчике вызываете соответствующий метод в зависимости от типа.

5 голосов
/ 26 августа 2011

Я думаю, что ваш лучший вариант - просто назвать метод по-другому.

public void clawBackFinReqs(Collection<FinanceRequest> financeRequestList) {

}

public void clawBackComTrans(Collection<CommissionTrns> commissionTrnsList) {

}

На самом деле, это не так уж и плохо, так как вы не получаете ничего лишнего, имея на них одно и то же имя.

Имейте в виду, что JVM не решит, какой метод вызывать во время выполнения. В отличие от виртуальных методов / методов переопределение разрешение перегруженных методов выполняется во время компиляции. Учебники Java по перегрузке метода даже указывают на то, что "перегруженные методы должны использоваться экономно ..." .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...