我正在使用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
);
答案 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());