Java方法重载

时间:2011-09-28 07:59:06

标签: java

我有两种方法可以实现一种计算方法,我想知道什么是更好的方法。

该方法需要一些int和double参数,并且(在某些情况下)需要一个特殊标志来进行一些不同的计算。

在第一个例子中,我可以使用'calculateFoo(1,2.0d)'调用方法,使布尔标志== FALSE。

在第二个例子中,我总是要设置布尔标志(即使我不需要它)

方法1 :(这里我使用'...'作为'方法重载'参数)

public SomeObject calculateFoo(int pIntValue, double pDoubleValue, boolean... pDoSpecialStuff) {

    if (pDoSpecialStuff.length == 0 || pDoSpecialStuff[0] == false) {
        // method was called without boolean flag or boolean flag was set to FALSE

        // do some calculation stuff
        // ...
    } else {
        // method was called with boolean flag == TRUE

        // do some other calculation stuff
        // ...
    }

    return SomeObject; 
}

方法2 :(这是'常见'方法)

public SomeObject calculateFoo(int pIntValue, double pDoubleValue, boolean pDoSpecialStuff) {

    if (pDoSpecialStuff == false) {
        // method was called with boolean flag == FALSE

        // do some calculation stuff
        // ...
    } else {
        // method was called with boolean flag == TRUE

        // do some other calculation stuff
        // ...
    }

    return SomeObject; 
}

4 个答案:

答案 0 :(得分:2)

你的方法都有代码味道,布尔标志很糟糕

这是我的建议

public SomeObject calculateFoo(int pIntValue, double pDoubleValue) {
    // normal calculation here 
}

public SomeObject calculateFooSpecial(int pIntValue, double pDoubleValue) {
    // special calculation here 
}

答案 1 :(得分:1)

做第二个变体,因为它更明确。 Varargs允许您传递多个布尔值,然后不使用它们。最好使用单个布尔值显式定义接口。

如果您想要布尔标志的默认值,请使用另一个重载:

public SomeObject calculateFoo(int pIntValue, double pDoubleValue) {
   return calculateFoo(pIntValue, pDoubleValue, false);
}

答案 2 :(得分:1)

考虑以下模式:

public ResultType calcFoo( int i, double d ) {
    return calc( i, d, false );
}

public ResultType calcFoo( int i, double d, boolean flag ) {
    if( flag ) {
        ...
        return result;
    }
    else {
        ...
        return result;
    }
}

通常最好使用枚举而不是布尔标志。它使您的代码更具可读性,同样快。

我注意到你考虑使用varargs。如果要使用更多标志,请考虑使用EnumSet将一组标志传递给方法。如果你想传递0或1个标志,varargs甚至更像是反模式。

答案 3 :(得分:0)

我将使用两个参数定义另一个方法来执行默认计算。

public SomeObject calcFoo(int, double) {
    ....
}

public SomeObject calcFoo(int i, double d, boolean b) {
    if(b) {
        ....
    } else {
        return calcFoo(i, d);
    }
}