簡體   English   中英

如何有條件地將Java中的參數傳遞給一個采用可變數量參數的方法?

[英]How to conditionally pass parameters in Java to a method that takes a variable number of arguments?

我正在使用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中的參數傳遞給一個采用可變數量參數的方法?

@Richard回答了有關JDO Query類的具體問題。 (使用備用queryWith...方法之一。)

更一般的問題的答案是“它取決於”。 具體而言,它取決於方法簽名。

1)如果聲明方法采用可變數量的參數作為數組,列表,映射或其他方式傳遞,那么答案是顯而易見的。 在數組/列表/ map /中組裝實際參數,然后傳遞它們。

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對象。 所以你最終得到的條件/開關代碼相當於非反射情況。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM