Java,方法的非固定参数

Java,方法的非固定参数,java,Java,我是Java初学者。有一种方法: public void method (int param1, int param2, int param3, int param4) 根据具体情况,我有时需要将参数传递给[param1]或[param2,param4],这取决于XML设置。但是传递(0,desiredValue1,desiredValue2,0)并不是那么简单——最好是传递一个关联数组来定义参数名及其值。我听说这种工作是通过反射完成的。你可以通过一个数组: public void metho

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

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

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

你可以通过一个数组:

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);
或者您可以传递一个列表:

public void method (List<Integer> params)
公共作废方法(列表参数)
或者你可以传递一张地图:

public void method (Map<Integer,Integer> params)
public void方法(映射参数)
如果您有大量可选参数,并且只想传递其中的几个参数,则后者将是最有效的:

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

您可以传递一个数组:

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);
或者您可以传递一个列表:

public void method (List<Integer> params)
公共作废方法(列表参数)
或者你可以传递一张地图:

public void method (Map<Integer,Integer> params)
public void方法(映射参数)
如果您有大量可选参数,并且只想传递其中的几个参数,则后者将是最有效的:

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

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

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

通过这种方式,您无需再次写入参数名称,因此不会出现复制粘贴错误。

在这种情况下,您可以使用映射实例:

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

这样,您就不需要一次又一次地写入参数名称,因此不会出现复制粘贴错误。

不是反射。使用重载:

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

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 ) );
地图是另一种选择

更好地解析和解释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 ) );
类参数{
字符串名;
T值。。。
参数(字符串名称,T值){…}
}
无效方法(参数…参数){
用于(参数par:参数){
开关(PAR.GETNAME()){
案例“param1”:/。。。
//...
}
}
}
方法(新参数(“参数1”,42),
新参数(“参数3”,3.14));

如果不需要泛型,只需在所有相关位置使用int即可。

不需要反射。使用重载:

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

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 ) );
地图是另一种选择

更好地解析和解释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 ) );
类参数{
字符串名;
T值。。。
参数(字符串名称,T值){…}
}
无效方法(参数…参数){
用于(参数par:参数){
开关(PAR.GETNAME()){
案例“param1”:/。。。
//...
}
}
}
方法(新参数(“参数1”,42),
新参数(“参数3”,3.14));

如果不需要泛型,只需在所有相关位置使用int。

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

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

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

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

您可以简单地使用重载版本的函数:使用
Map
。但我会首先重新考虑你的设计,看看这是否绝对是唯一的选择。虽然这个问题有不止一个技术解决方案,但我认为你应该重新考虑你的设计。你可以简单地使用函数的重载版本:使用
映射
。但我会首先重新考虑你的设计,看看这是否绝对是唯一的选择。虽然这个问题有不止一个技术解决方案,但我认为你应该重新考虑你的设计。我怎么能从varargs本身理解我已经传递了我函数的第一、第二和第四个参数,而不是第二、第三和第四个参数?好的,是的,仍然不知道如何调用我的原始方法(inta,intb,intc,intd)我如何从varargs本身理解我已经传递了函数的第一,第二和第四个参数,而不是第二,第三和第四个参数?好的,是的,仍然不知道如何调用我的原始方法(inta,intb,intc,intd)谢谢,但我不这么认为:所以,即使我有:void method(inta,intb)void method(intc,intb)一个类似(1,2)的调用-运行哪个方法?那么您必须求助于Integer,其中null表示缺少值或映射。-但是在几十年的编程中,我只遇到过一次这样的情况(IIRC);所以我不相信你真的需要这样做。即使你以某种方式指出哪种组合是“活跃的”,你也会感到负担