如何在Java中编写简短的逻辑表达式?

时间:2015-03-13 21:22:27

标签: java logical-operators

有没有办法对同一个变量进行连续的逻辑运算?

示例:

if (animation.getStatus() == Animation.Status.PAUSED || animation.getStatus() == Animation.Status.STOPPED) {
    animation.playFromStart();
} else if (animation.getStatus() == Animation.Status.RUNNING) {
    animation.stop();
}

你在if子句中看到我检查animation.getStatus()两次,一次暂停,一次停止。 有没有办法让它像animation.getStatus() == Animation.Status.PAUSED || Animation.Status.STOPPED

我确定已经问过这个问题,但我真的不知道要搜索什么,所以如果这是重复的话,我很抱歉。

4 个答案:

答案 0 :(得分:7)

没有; Java语法是不可变的。

有几种选择,但最简单的是重构,作为奖励使其清晰可辨,例如,

if (animation.shouldReplay()) {
    animation.playFromStart();
} else if (animation.shouldStop() {
    animation.stop();
}

或更深层次,例如,

animation.controlFromCurrentStatus();

如果您不愿意封装,只需导入状态有助于:

Animation.Status currentStatus = animation.getStatus();
if (currentStatus == PAUSED || currentStatus == STOPPED) {
    animation.playFromStart();
} else if (currentStatus == RUNNING) {
    animation.stop();
}

或者让他们成为enum,无论如何他们应该是:

switch (currentStatus) {
case PAUSED:
case STOPPED:
    animation.playFromStart();
    break;
case RUNNING:
    animation.stop();
}

答案 1 :(得分:1)

您可以通过以下几种方式实现:

  1. 引入临时变量 - 创建变量,为其指定状态,并在表达式中使用变量的值,而不是多次进行调用
  2. 通过编写辅助方法 - 编写一个获取当前状态和状态变量参数列表的方法,并在条件中调用此方法。
  3. 以下是第一种方式的说明:

    Animation.Status status = animation.getStatus();
    if (status == Animation.Status.PAUSED || status == Animation.Status.STOPPED) {
        animation.playFromStart();
    } else if (status == Animation.Status.RUNNING) {
        animation.stop();
    }
    

    以下是第二种方式的说明:

    private static boolean checkStatus(Animation.Status status, Animation.Status... expected) {
        for (Animation.Status e : expected) {
            if (e == status) {
                return true;
            }
        }
        return false;
    }
    ...
    if (checkStatus(animation.getStatus(), Animation.Status.PAUSED, Animation.Status.STOPPED)) {
        ...
    }
    

答案 2 :(得分:1)

在这种情况下,switch语句看起来不错

switch (animation.getStatus()) {
    case Animation.Status.PAUSED:
    case Animation.Status.STOPPED:
        animation.playFromStart();
        break;
    case Animation.Status.RUNNING:
        animation.stop();
        break;
}

答案 3 :(得分:0)

如果您的代码是多线程的,如果您正在运行动画并希望能够停止/启动/暂停它们,那么您应该考虑同步。

所以要使用Dave Newtons代码片段并使其成为线程安全的:

synchronized(this){
    if (animation.shouldReplay()) {
        animation.playFromStart();
    } else if (animation.shouldStop() {
       animation.stop();
    }
}

因此,没有危险,第一个条件将返回false,然后当前线程不再运行,另一个线程修改动画的状态,然后当前线程再次变为Runnable并尝试停止动画。