0

当我们有一个接受相同类型参数的方法时,我们可能会遇到以错误顺序传递参数的问题,即交换

示例int someMethod(int a, int b)
调用者someMethod(b,a)改为调用方法。我认为有一种设计模式可以避免这个问题。对吗?
它是什么?

4

3 回答 3

4

听起来您指的是Java不支持的命名参数。最好的选择是使用一个对象来包装参数。

int someMethod(SomeBean bean);

...

SomeBean bean = new SomeBean();
bean.setA(1);
bean.setB(2);
someMethod(bean);
于 2013-03-11T12:33:46.113 回答
1

You can use enum if there is a clear specification of acceptable values for the method arguments.

enum ValuesA {
    ONE(1), TWO(2), THREE(3), FOUR(4);
    private int val;
    ValuesA(int val) {this.val = val;}
    int val() {return val;}
}

enum ValuesB {
    TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6);
    private int val;
    ValuesB(int val) {this.val = val;}
    int val() {return val;}
}

With this your someMethod needs to be modified as well:

int someMethod(ValuesA a, ValuesB b)

Which will be invoked like this:

someMethod(ValuesA.ONE, ValuesB.FOUR)

And inside the method you will have to get the int values with val(): a.val(), b.val()..

Of course this applies only when you already know the sets of allowed values for a and b and the sets aren't too big.

Another limitation is the inability to use variables during method invocations.

于 2013-03-11T12:54:08.720 回答
0

如果您有一个参数列表,其中参数是相关的,并且此关系指示可以一起传递的有效值集,那么您最好创建一个理解这些有效性规则的类,并传递它而不是参数列表。

例如,如果您的方法签名是

int someMethod(int low, int high)

并且您想禁止呼叫,例如

int z = someMethod(10, 6);

由于值的顺序错误,您可能需要创建一个Range类,大致如下:

public class Range {

    private int low;
    private int high;

    public Range(int low, int high) {
        super();
        if (high < low)
            throw new IllegalArgumentException("Invalid range");
        this.low = low;
        this.high = high;
    }

    public int getLow() {
        return low;
    }

    public int getHigh() {
        return high;
    }
}

并将您的方法的签名更改为

int someMethod(Range range)

这样您只能将其传递给已构建且有效的范围。

如果关系是别的东西,当然你会创建一个不同的类来捕获不同的规则。

于 2013-03-12T11:48:56.587 回答