【问题标题】:How to conditionally pass parameters in Java to a method that takes a variable number of arguments?如何有条件地将Java中的参数传递给采用可变数量参数的方法?
【发布时间】:2011-04-13 23:35:35
【问题描述】:

我正在使用 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

    );

【问题讨论】:

    标签: java conditional parameter-passing


    【解决方案1】:

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

    @Richard 已回答有关 JDO Query 类的具体问题。 (使用替代的queryWith... 方法之一。)

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

    1) 如果方法被声明为采用 传递的参数数量可变 作为数组、列表、地图或其他任何东西, 那么答案是显而易见的。集合 数组中的实际参数 / 列出/映射/任何东西,然后传递它们。

    2) 如果方法声明为 “varargs”参数,那么你可以 传递一个明确的实际数组 参数;例如

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

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

      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 对象。因此,您最终会得到等效于非反射情况的条件/切换代码。

    【讨论】:

      【解决方案2】:

      我建议使用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());
      

      【讨论】:

      • +1 如果每个人在提问之前都检查过 API,那么我们在这里就没有名气了。另外,executeWithMap 可能会更简单一些。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多