有没有办法对同一个变量进行连续的逻辑运算?
示例:的
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
?
我确定已经问过这个问题,但我真的不知道要搜索什么,所以如果这是重复的话,我很抱歉。
答案 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)
您可以通过以下几种方式实现:
以下是第一种方式的说明:
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并尝试停止动画。