当我们有一个接受相同类型参数的方法时,我们可能会遇到以错误顺序传递参数的问题,即交换
示例int someMethod(int a, int b)
调用者someMethod(b,a)
改为调用方法。我认为有一种设计模式可以避免这个问题。对吗?
它是什么?
当我们有一个接受相同类型参数的方法时,我们可能会遇到以错误顺序传递参数的问题,即交换
示例int someMethod(int a, int b)
调用者someMethod(b,a)
改为调用方法。我认为有一种设计模式可以避免这个问题。对吗?
它是什么?
听起来您指的是Java不支持的命名参数。最好的选择是使用一个对象来包装参数。
int someMethod(SomeBean bean);
...
SomeBean bean = new SomeBean();
bean.setA(1);
bean.setB(2);
someMethod(bean);
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.
如果您有一个参数列表,其中参数是相关的,并且此关系指示可以一起传递的有效值集,那么您最好创建一个理解这些有效性规则的类,并传递它而不是参数列表。
例如,如果您的方法签名是
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)
这样您只能将其传递给已构建且有效的范围。
如果关系是别的东西,当然你会创建一个不同的类来捕获不同的规则。