如何检查函数的任何两个参数都为null

时间:2013-09-08 10:58:04

标签: java function parameters coding-style

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

returnType function(p1, p2, p3){

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

}

但这相当麻烦,不能扩展到更多的参数。

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

提前致谢。

7 个答案:

答案 0 :(得分:6)

returnType function(p1, p2, p3){
   Object[] args = {p1, p2, p3};
   if(Collections.frequency(Arrays.asList(args), null) >= 2) {
        return;
   }
}

答案 1 :(得分:3)

可能重构方法以传递List<Object>或类似的方法,然后迭代列表以检查空值的数量。

答案 2 :(得分:3)

  

但这相当麻烦,不能扩展到更多的参数。

此外,这不会编译。您需要为每个参数添加与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) {
    ...
}

答案 3 :(得分:1)

将参数传递给 public void someMethod(Object... param){// your code }

您将获取param作为Object数组,然后遍历数组以检查空值。一旦你的计数达到2,就打破循环并宣告失败。

static void check(Object... param)
{
   int count= 0;
   for (int i = 0; i < param.length; i++)
        // check param[i] and increase count
   return count;
}

编辑1:

如果您不熟悉java中的变量参数,我建议您阅读https://today.java.net/pub/a/today/2004/04/19/varargs.html

答案 4 :(得分:1)

使用Java 5的智能解决方案是一种varargs验证功能。

您可以创建一个实用程序验证函数,该函数接受varargs对象参数,并检查它们是否都不为空。

然后,当您发现两个以上的参数为空时,您可以迭代数组并停止循环。

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

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

答案 5 :(得分: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;
   }
}

答案 6 :(得分:0)

尝试另一种检查方式,

boolean isAtleastTwoNull = (p1==null )? (p2== null || p3==null): (p2==null && p3==null);