Java,非固定参数的方法

时间:2014-07-27 18:34:51

标签: java

我是Java的初学者。有一种方法:

public void method (int param1, int param2, int param3, int param4)

取决于具体情况,我有时需要将参数传递给[param1]或[param2,param4],这取决于XML设置。但简单地传递(0,desiredValue1,desiredValue2,0)并不是那么简单 - 最好的方法是传递一个关联数组来定义参数名称及其值。我听说这种工作完成了反思。

4 个答案:

答案 0 :(得分:3)

不反思。使用重载:

public void method (int param1)
public void method (int param2, int param4)

如果你真的需要超过4种,直到所有15种组合,请考虑其他选择。

public void method (Integer param1, Integer param2, Integer param3, Integer param4)

这将允许您为缺少的参数传递null。

地图是另一种选择。

更好地解析和解释XML可能会带来更简单的解决方案。

<强>后来

当然,您可以使用某种标记的&#34;存储参数。

class Parameter<T> {
    String name;
    T value; ... 
    Parameter( String name, T value ){...}
}

void method( Parameter<?>... parameters ){
    for( Parameter<?> par: parameters ){
        switch( par.getName() ){
        case "param1": //...
        //...
        }
    }
}

method( new Parameter<Integer>( "param1", 42 ),
        new Parameter<Double>( "param3", 3.14 ) );

如果您不需要通用性,只需在所有相关位置使用int。

答案 1 :(得分:1)

你可以传递数组:

public void method (int[] params)

这仍然需要您分配n个元素的数组,其中n是潜在参数的最大数量,并且对于大的n可能是浪费。它还要求您有一个默认的空值(例如0),它告诉您数组中的某个位置没有值。

   int[] params = new int[13];
   params[0] = value1;
   params[3] = value4;
   params[4] = value5;
   method (params);

或者您可以传递一个List:

public void method (List<Integer> params)

或者您可以传递地图:

public void method (Map<Integer,Integer> params)

如果您有大量可选参数,并且您只想传递其中几个参数,后者将是最有效的:

Map map = new HashMap<Integer,Integer>();
map.put (5, value5);
map.put (13, value13);
method (map);

答案 2 :(得分:1)

在这种情况下,您可以使用地图实例:

public void method(final Map<String, Integer> params) {
    // code omitted
}

在方法体中,您将有一些if-else语句来提取和使用已传递的参数。

更新。:可能更好的方法是使用枚举中的地图,用于将参数命名为实际值:

enum MethodParameters { Param1, Param2, Param3 };
public void method(final Map<MethodParameters, Integer> params) {
    // code omitted
}

这样您就不需要多次编写参数名称,因此您不会收到复制粘贴错误。

答案 3 :(得分:1)

与使用Map类似,您可以使用varargs并自行解析,尽管使用重载函数或更好地解析XML会更好。我会非常小心这样做或Map方式;你应该对传入的参数进行大量的错误检查。

private void printParams(Object... params) {
    for (Object param : params) System.out.println(param);
}