2

假设我有一个接受三个参数的函数。当然我可以通过这种方式检查这个函数的任何两个参数是否为空。

returnType function(p1, p2, p3){

  if((p1 == null && p2 == null) || (p2 == null && p3 == null) || (p3== null && p1 == null)){
       return;    
   }

}

但这相当麻烦,并且无法针对更多参数进行扩展。

这样做的优雅方法是什么?

提前致谢。

4

7 回答 7

8
returnType function(p1, p2, p3){
   Object[] args = {p1, p2, p3};
   if(Collections.frequency(Arrays.asList(args), null) >= 2) {
        return;
   }
}
于 2013-09-08T11:05:23.500 回答
4

但这相当麻烦,并且无法针对更多参数进行扩展。

而且,这不会编译。您需要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) {
    ...
}
于 2013-09-08T11:03:44.253 回答
3

也许重组方法以传递一个List<Object>或类似的,然后迭代列表以检查空值的数量。

于 2013-09-08T11:02:07.340 回答
2

将您的参数传递为 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

于 2013-09-08T11:13:10.300 回答
1

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;
}

使用此实用功能,您可以检查所有参数,并在找到更有效的策略时更改测试策略。

于 2013-09-08T11:20:32.813 回答
0

试试这只是另一种检查方式,

boolean isAtleastTwoNull = (p1==null )? (p2== null || p3==null): (p2==null && p3==null);
于 2013-09-08T11:14:03.547 回答
0

您始终可以在一个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;
   }
}
于 2013-09-08T11:02:14.073 回答