0

以下の3つの方法のような12の方法があります。私は、それらすべてがまったく同じ機能を実行していることに気付きました。変更されているのは、メソッドの名前と if 条件だけです。以下の条件を処理できる 1 つのジェネリック メソッドを作成するスマートな方法はありますか。

補足: 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

1 つの方法は、条件を述語クラスとして抽出することです。ラムダ式があればもっといいのですが、残念ながらこれは 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)orで呼び出しますgetSomething(nationalTelephony)

于 2013-09-27T20:43:58.153 に答える
0

これを呼び出すコードがどのように見えるかはよくわかりませんが、これはenumwith メソッドの良い候補かもしれません。booleanこれらの各条件は式 onに簡略化callXCDでき、宣言できます。

public abstract boolean useDiscountedAmount(CallXCD callXCD);
于 2013-09-27T20:37:33.040 に答える
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 に答える