0

我有 12 种方法,如下面的三种方法。我注意到他们都在做同样的功能,唯一改变的是方法的名称和 if 条件。有没有什么聪明的方法可以制作一种可以处理以下条件的通用方法。

旁注: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;   
}
4

3 回答 3

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)

于 2013-09-27T20:43:58.153 回答
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;
}

应该管用。

于 2013-09-27T20:36:14.307 回答
0

我不太确定调用它的代码看起来如何,但这可能是enumwith 方法的一个很好的候选者;这些条件中的每一个都可以简化为 上的boolean表达式callXCD,并且您可以声明

public abstract boolean useDiscountedAmount(CallXCD callXCD);
于 2013-09-27T20:37:33.040 回答