![](/img/trans.png)
[英]How to use Invoke() if the invoked method takes in a variable number of parameters
[英]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.