繁体   English   中英

Java,方法的非固定参数

[英]Java, non fixed parameters for method

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

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

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

没有反思。 使用重载:

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

如果您真的需要多达15种组合中的4种以上,请考虑其他选择。

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

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

地图是另一种选择。

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

后来

当然,您可以为参数使用一种“标记”存储。

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即可。

您可以传递一个数组:

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);

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

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
}

这样,您无需一次编写参数名称,因此不会出现复制粘贴错误。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM