我有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 :(得分: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)
。
答案 1 :(得分: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;
}
应该工作。
答案 2 :(得分:0)
我不确定调用它的代码看起来如何,但这可能是enum
方法的一个很好的候选者;这些条件中的每一个都可以简化为boolean
上的callXCD
表达式,您可以声明
public abstract boolean useDiscountedAmount(CallXCD callXCD);