减少表达式中使用的条件运算符数(4)(允许的最大值为3)

时间:2017-04-06 07:26:34

标签: java conditional-operator

如何减少运营商的复杂性?我有条件问题。

Object someObject = getSomeObject();
boolean isNotInstanceOfA = !(someObject instanceof A);
boolean isNotInstanceOfB = !(someObject instanceof B);
boolean isNotInstanceOfC = !(someObject instanceof C);
boolean isNotInstanceOfABC = isNotInstanceOfA && isNotInstanceOfB && isNotInstanceOfC;
if (isNotInstanceOfABC && (container.getChildren(itemId) == null || container.getChildren(itemId).isEmpty())) {
    return "something";
 }

4 个答案:

答案 0 :(得分:5)

您实际上可以在if块之前计算条件,以便代码更具可读性,如下所示:

boolean isChildNull = (container.getChildren(itemId) == null);
boolean isChildEmpty = (isChildNull || container.getChildren(itemId).isEmpty());

if (isNotInstanceOfABC && isChildEmpty) {
    return "something";
}

但是,我从你的代码中推断出你做错了什么因为你做了很多instanceof检查,这根本不是一个好习惯,你可能需要考虑<如解释here用多态性替换条件)那样强大>重构代码。

答案 1 :(得分:4)

itemId是原始类型还是没有?我猜它不是原始的并且为了减少代码,你可以将这个null或空检查移动到一个单独的方法并返回一个布尔值..而你也可以减少这样的代码:`

xsl:for-each

答案 2 :(得分:1)

不确定它是否适合您,但我会尝试以这种方式重构代码:

db.execute()
Object someObject = getSomeObject();

if (isInstanceOfABC(someObject)) {
    log.debug("Instance of A, B or C");
    return;
}

if (childrenIsEmptyOrNull( container.getChildren(itemId) ) {
    log.debug("Children is null or empty");
    return;
}

return "something";
private boolean isInstanceOfABC(Object someObject) {
    return someObject instanceof A
            || someObject instanceof B
            || someObject instanceof C;
}

然而,

使用private boolean childrenIsEmptyOrNull(Children children) { return children == null || children.isEmpty(); } 代码异味。每当我看到这样的建筑时,我肯定会出现问题。你现在最好停下来,在多态性的帮助下摆脱所有这些检查。

答案 3 :(得分:0)

规范化您的逻辑表达式,然后使用下面的方法

public boolean AND_Operator(boolean ...values) {

        for (boolean b : values) {
            if(!b)
                return false;
        }

        return true;
    }

    public static boolean OR_Operator(boolean ...values) {

        for (boolean b : values) {
            if(b)
                return true;
        }

        return false;
    }