Java: 向方法传递多个参数

34

这是我的情景:

我需要调用一个方法,参数有: Parameter1、Parameter2、……、ParameterN, 但每种情况下所需发送到该方法的参数可能会发生变化。

情况一:仅发送 Parameter1

情况二:发送一组参数组合

情况三:发送所有参数

在Java中,最好的实现方式是什么?

3个回答

67

解决方案取决于一个问题的答案——所有参数是否都是相同的类型,如果是,那么每个参数会被同等对待吗?

如果参数不是相同的类型,或者更重要的是,不会被同等对待,则应使用方法重载:

public class MyClass
{
  public void doSomething(int i) 
  {
    ...
  }

  public void doSomething(int i, String s) 
  {
    ...
  }

  public void doSomething(int i, String s, boolean b) 
  {
    ...
  }
}

但是,如果每个参数都是相同类型并且将以相同方式处理,则可以在Java中使用变量args特性:

public MyClass 
{
  public void doSomething(int... integers)
  {
    for (int i : integers) 
    {
      ...
    }
  }
}

显然,当使用可变参数时,您可以通过其索引访问每个参数,但我建议不要这样做,因为在大多数情况下,这暗示着设计上的问题。同样,如果您发现自己在迭代参数时进行类型检查,则需要审查设计。


所有的参数类型不相同,而且我们不知道将要传递多少个参数。 - Srinivas R
1
我应该表达得更清楚 - 所有参数都能作为相同的超类型处理,而不需要进行类型检查吗?类型检查并不是世界末日,但在大多数情况下,我认为这是代码异味。 - Nick Holt
所有的参数类型不同,我们也不知道将要传递多少个参数。 例如: method( String a1, String a2, String b1, String b2, .. , .. 以及一些常见的 int、String 参数 ) 其中 a1 和 a2 是一组,b1 和 b2 是另一组,依此类推。但我们不知道需要传递多少组。 - Srinivas R
要使用可变参数来实现这一点,您最终会得到每个参数都是Object类型的共同超类型。但我想表达的是,您将如何区分不同的参数集?您必须像@erencan建议的那样传递某种Parameter对象。 - Nick Holt

19

假设您有一个打印多个对象的无返回值方法;

public static void print( Object... values){
   for(Object c : values){
      System.out.println(c);
   }
}

在上面的例子中,我使用了vararge作为参数,它接受从0到N的值。

来自评论:那如果是2个字符串和5个整数呢?

答案:

print("string1","string2",1,2,3,4,5);

如果是两个字符串和五个整数呢? - Suresh Atta
不要称它们为“String”,而是称之为“Object”。 - jrad
@sureshatta:Jack已经回答了。将vararge作为Object类型。 - Azad
1
+1,简单地说就是 public static void methodname(Object... params) - Suresh Atta
@sureshatta:谢谢,我会更新它。 - Azad
显示剩余2条评论

7

2
+1,为了添加文档.. - Suresh Atta
可变参数必须在参数列表的最后。 - CoolMind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接