有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

共 (3) 个答案

  1. # 1 楼答案

    你可以把一个大的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. # 2 楼答案

    一种方法是将条件提取为谓词类。如果我们能有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)来调用它

  3. # 3 楼答案

    我不太确定调用它的代码是什么样子的,但这可能是enum方法的一个很好的候选者;这些条件中的每一个都可以简化为callXCD上的boolean表达式,您可以声明

    public abstract boolean useDiscountedAmount(CallXCD callXCD);