如何有条件地将Java中的参数传递给一个采用可变数量参数的方法?

时间:2010-09-18 00:21:41

标签: java conditional parameter-passing

我正在使用JDO Query类,我需要有条件地将某些参数传递给execute方法,如下面的代码所示。

我不知道如何用Java做到这一点。

query.declareParameters("String alphaP");
query.declareParameters("String bravoP");
query.declareParameters("String charlieP");

if (condition) {
    if (othercondition) {
        query.declareParameters("List<String> stringList");
    }
    else {
        query.declareParameters("String simpleString");
    }
}

if (someothercondition) {
    query.declareParameters("int deltaP");
}

if (yetanothercondition) {
    query.declareParameters("int echoP");
}

if (thelastcondition) {
    query.declareParameters("int foxtrotP");
}

List<ResultClass> results = (List<ResultClass>) query.execute(
    alphaP, 
    bravoP, 
    charlieP,

    // ... and whatever other parameters are required based on 
    // which conditions are true above

    );

2 个答案:

答案 0 :(得分:5)

  

如何有条件地将Java中的参数传递给采用可变数量参数的方法?

@Richard回答了有关JDO Query课程的具体问题。 (使用其中一种替代queryWith...方法。)

更普遍的问题的答案是“它取决于”。具体来说,它取决于方法签名。

1)如果声明方法采取a    传递的参数数量可变    作为数组,列表,地图或其他,    那么答案很明显。集合    数组中的实际参数/    list / map / whatever,并传递它们。

2)如果方法是用a声明的    “varargs”参数,那么你可以    传递一个明确的实际数组    参数; e.g。

  public void test(String... args) { ... }

  test("Hi", "Mom");
  test(new String[]{"Hi", "Pa"});
  String[] args = new String[]{"Hi", "Bro"};
  test(args);

3)如果实际上有多个    重载方法,然后你没有    选择,但以programmaticaly选择    并调用适当的重载    根据您的参数数量    必须通过:

  public void test(String arg1) { ... }
  public void test(String arg1, String arg2) { ... }
  ...

  if (nosArgs == 1) {
      test(arg1);
  } else if (nosArgs == 2) {
      test(arg1, arg2);
  } else ...

您可能认为反射会有所帮助,因为当您反射性地调用方法时,您将实际参数作为Object[]传递。但这没有多大帮助,因为您还需要使用适当的Method对象,并且(比如)test方法的每个重载都有一个不同的Method对象。因此,您最终得到的条件/开关代码等同于非反射情况。

答案 1 :(得分:4)

我建议使用executeWithArray方法:使用java.util.ArrayList实例动态构建参数数组,然后使用toArray方法将其转换为数组。代码可能如下所示:

ArrayList<Object> args = new ArrayList<Object>();
args.add(alphaP);
args.add(bravoP);
args.add(charlieP);
// Add other arguments here...

List<ResultClass> results = (List<ResultClass>) query.executeWithArray(args.toArray());