if条件检查在JAVA中的任何一点是否只有一个变量被设置为四个变量

时间:2013-11-25 12:28:59

标签: java logic logical-operators

如果设置了四个变量中的一个,我想显示错误... 在Java ..这就是我想出的......

if( (isAset() && isBset()) || (isBset() && isCset()) || (isCset() && isDset()) || (isDset() && isAset()) )
    attri.greedySelectionException(..);  

我想检查是否有更好的方法来做这件事。?

6 个答案:

答案 0 :(得分:9)

你如何使用计数器然后将其与1进行比较?

像...一样的东西。

int i = 0;
if (isAset()) i++;
if (isBset()) i++;
if (isCset()) i++;
if (isDset()) i++;

if (i > 1)
  ...

或者,如果要检查某个对象的属性,可以使用一些反射来遍历相关属性,而不是每个属性都有一个if语句。

编辑:看看下面的MariusŽilėnas的varargs静态方法的一些更整洁的代码,即使用(将oldschool更改为for-each和if的三元表达式):

static int trueCount(boolean... booleans) {
  int sum = 0;
  for (boolean b : booleans) {
    if (b) {
      sum++;
    }
  }
  return sum;
}

而不是几个if语句。

答案 1 :(得分:3)

您可以使用以下方法简化此表达式:

if((isAset() || isCset()) && (isBset() || isDset()))
   attri.greedySelectionException(..);  

Wolfram alpha为您完成了这项工作:

Original expression

您可以使用真值表进行验证:

Original

Final

答案 2 :(得分:0)

我建议使用varargs ...(参见Java教程)并创建一个计算给出了多少trues的函数。以下代码演示了它:

public class Values
{
    public static boolean isASet()
    {
        return false;
    }

    public static boolean isBSet()
    {
        return true;
    }

    public static boolean isCSet()
    {
        return true;
    }

    public static boolean isDSet()
    {
        return true;
    }

    public static int booleans(boolean... booleans)
    {
        int sum = 0;
        for (int i = 0; i < booleans.length; i++)
        {
            sum += booleans[i] ? 1 : 0;
        }
        return sum;
    }

    public static void main(String[] args)
    {
        System.out.println(
                booleans(isASet(), isBSet(), isCSet(), isDSet()));
        if (1 < booleans(isASet(), isBSet(), isCSet(), isDSet()))
        {
            System.out.println("Condition met.");
        }
    }
}

答案 3 :(得分:0)

如果您可以控制isAset(),isBSet,isCSet和&amp;的实现。 isDset方法,如果从此函数返回1或0而不是true或fales,则可以更加清晰地实现此目的。这些功能将创建如下......

public int isAset()
{
   return (A != null) ? 1 : 0;
}

要验证是否设置了多个变量,请使用以下内容...

if( isASet() + isBSet() + isCSet() + isDSet() > 1)
     ThrowMoreAreSetException()

如果你对此无法控制,这是另一种方法......

int count = isASet() ? 1 : 0;
count+= isBSet() ? 1 : 0;
count+= isCSet() ? 1 : 0;
count+= isDSet() ? 1 : 0;

if(count > 1)
 ThrowMoreAreSetException()

通过遵循这些方法中的任何一个,代码将比执行somany比较组合更不笨拙和可读性。

答案 4 :(得分:0)

在Java 8中,您可以优雅地使用Streams解决此问题(假设未设置值,则为null):

if (Stream.of(valueA, valueB, valueC, valueD).filter(Objects::nonNull).count() != 1) { 
    /* throw error */ 
}

答案 5 :(得分:-3)

试试这个:

if (!(isAset ^ isBset ^ isCset ^ isDset))

只有任何一个为真,否则为真。