如果设置了四个变量中的一个,我想显示错误... 在Java ..这就是我想出的......
if( (isAset() && isBset()) || (isBset() && isCset()) || (isCset() && isDset()) || (isDset() && isAset()) )
attri.greedySelectionException(..);
我想检查是否有更好的方法来做这件事。?
答案 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为您完成了这项工作:
您可以使用真值表进行验证:
答案 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))
只有任何一个为真,否则为真。