评估执行相同功能的不同条件的通用方法

时间:2013-09-27 20:31:42

标签: java oop

我有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;   
}

3 个答案:

答案 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);