假设我有一个接受三个参数的函数。当然我可以通过这种方式检查这个函数的任何两个参数是否为空。
returnType function(p1, p2, p3){
if((p1 == null && p2 == null) || (p2 == null && p3 == null) || (p3== null && p1 == null)){
return;
}
}
但这相当麻烦,并且无法针对更多参数进行扩展。
这样做的优雅方法是什么?
提前致谢。
假设我有一个接受三个参数的函数。当然我可以通过这种方式检查这个函数的任何两个参数是否为空。
returnType function(p1, p2, p3){
if((p1 == null && p2 == null) || (p2 == null && p3 == null) || (p3== null && p1 == null)){
return;
}
}
但这相当麻烦,并且无法针对更多参数进行扩展。
这样做的优雅方法是什么?
提前致谢。
returnType function(p1, p2, p3){
Object[] args = {p1, p2, p3};
if(Collections.frequency(Arrays.asList(args), null) >= 2) {
return;
}
}
但这相当麻烦,并且无法针对更多参数进行扩展。
而且,这不会编译。您需要null
为每个参数添加比较,如下所示:
if((p1 == null && p2 == null )
|| (p2 == null && p3 == null)
|| (p3 == null && p1 == null)) ...
如果您需要扩展到更多的参数,请执行以下操作:
int count = 0;
if (p1 == null) count++;
if (p2 == null) count++;
if (p3 == null) count++;
// ... and so on
if (count >= 2) {
...
}
也许重组方法以传递一个List<Object>
或类似的,然后迭代列表以检查空值的数量。
将您的参数传递为
public int someMethod(Object... param){// your code }
您将获取参数作为对象数组,然后遍历数组以检查空值。一旦你的计数达到 2,就打破循环并声明失败。
static int check(Object... param)
{
int count= 0;
for (int i = 0; i < param.length; i++)
// check param[i] and increase count
if(param[i] == null){
count++;
}
// return count, this is the number of null parameters to the function.
return count;
}
编辑1:
如果您不熟悉 java 中的变量参数,我建议您阅读https://today.java.net/pub/a/today/2004/04/19/varargs.html
Java 5 的一个智能解决方案是可变参数验证功能。
您可以创建一个采用可变参数对象参数的实用程序验证函数,并检查它们是否都不为空。
然后你可以迭代数组并在发现两个以上的参数为空时停止循环。
boolean validate(int maxNull, Object... params) {
int count = 0;
if (params == null) {
return true;
}
for (Object param : params) {
if (param == null) {
count++;
}
if (count >= maxNull) {
return false;
}
}
return true;
}
使用此实用功能,您可以检查所有参数,并在找到更有效的策略时更改测试策略。
试试这只是另一种检查方式,
boolean isAtleastTwoNull = (p1==null )? (p2== null || p3==null): (p2==null && p3==null);
您始终可以在一个try
块中执行您的代码,并且catch
NullPointerException
String foo(Object p1, Object p2, Object p3){
String bar;
try {
bar = p1.toString() + p2.toString();
return bar;
} catch (NullPointerException e) {
return null;
}
}