2013-09-27 38 views
0

我有12種方法,如下面的三種方法。我注意到他們都在做同樣的功能,唯一改變的是方法的名稱和條件。有沒有什麼聰明的方法可以製作出一種能夠處理以下條件的通用方法。評估不同條件下執行相同功能的通用方法

備註:callXCD是具有這些方法的當前對象的子對象,其方法(如「isNational()」)受到保護。

public int getNationalTelephonyCost(){ 

    if(callXCD.isNational() && callXCD.isTelephony()) 
     return Integer.parseInt(callXCD.getDiscountedAmount()); 
    else 
     return 0; 
} 

public int getOnNetTelephony(){ 

    if(callXCD.isOnNet() && callXCD.isTelephony() && callXCD.isMobileOriginating()) 
     return Integer.parseInt(callXCD.getDiscountedAmount()); 
    else 
     return 0; 
} 

public int getLocalData(){ 

    if(callXCD.isLocal() && callXCD.isData()) 
     return Integer.parseInt(callXCD.getDiscountedAmount()); 
    else 
     return 0; 
} 
+0

你可以將callXCD包裝在一個隱藏這些方法的新對象中,但是如果你不能改變callXCD,你將不會離開多個if-s。 – arynaq

回答

0

你可以只把一個大if else if else if else鏈到覆蓋所有的if條件的單一方法。

例如...

public int singleMethod(){ 
    if(callXCD.isNational() && callXCD.isTelephony()) 
     return Integer.parseInt(callXCD.getDiscountedAmount()); 
    else if(callXCD.isOnNet() && callXCD.isTelephony() && callXCD.isMobileOriginating()) 
     return Integer.parseInt(callXCD.getDiscountedAmount()); 
    else if(callXCD.isLocal() && callXCD.isData()) 
     return Integer.parseInt(callXCD.getDiscountedAmount()); 
    else 
     return 0; 
} 

應該工作。

0

我不太確定這個代碼是如何調用它的,但這可能是一個很好的候選方案,用於方法enum;每個這些條件可以被簡化爲一個boolean表達上callXCD,並且可以聲明

public abstract boolean useDiscountedAmount(CallXCD callXCD); 
1

的一種方法是,以提取條件謂詞類。如果我們可以有Lambda表達式會更好,但是可惜的是,這是Java。

它看起來是這樣的:

public interface Predicate { 
    public boolean check(); 
} 

public int getSomething(Predicate p) { 
    if(p.check()) 
     return(Integer.parseInt(callXCD.getDiscountedAmount())); 
    return(0); 
} 

public Predicate nationalTelephony = new Predicate() { 
    public boolean check() { 
     return(callXCD.isNational() && callXCD.isTelephony()); 
    } 
}; 
public Predicate onNetTelephony = new Predicate() { 
    public boolean check() { 
     return(callXCD.isOnNet() && callXCD.isTelephony() && callXCD.isMobileOriginating()); 
    } 
}; 
public Predicate localData = new Predicate() { 
    public boolean check() { 
     return(callXCD.isLocal() && callXCD.isData()); 
    } 
}; 

然後你可以調用該方法,例如,getSomething(localData)getSomething(nationalTelephony)