Как условно передать параметры в Java методу, который принимает переменное число аргументов? - PullRequest
2 голосов
/ 18 сентября 2010

Я использую класс 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 ]

5 голосов
/ 18 сентября 2010

Как условно передать параметры в Java методу, который принимает переменное число аргументов?

@ Ричард ответил на конкретный вопрос относительно класса 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. Таким образом, вы получите условный код / ​​код переключения, который эквивалентен неотражающему регистру.

4 голосов
/ 18 сентября 2010

Я бы предложил использовать метод 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());
...