冗余条件

时间:2011-05-29 01:30:47

标签: java swing timer

我在oracles网站上看到的这段代码中存在问题。 有人可以帮我解释一下吗?

Action updateCursorAction = new AbstractAction() {
    boolean shouldDraw = false;
    public void actionPerformed(ActionEvent e) {
        if (shouldDraw = !shouldDraw) { // <----- here is my problem, what's this condition for? 
                                       // isn't it always false?
            drawCursor();
        } else {
            eraseCursor();
        }
    }
};

new Timer(300, updateCursorAction).start();

4 个答案:

答案 0 :(得分:12)

if (shouldDraw = !shouldDraw)

那不是if(shouldDraw != shoundDraw)。我认为这让你感到困惑。相反,它会对shouldDraw进行否定并检查结果是什么。

因此,功能是如果shouldDrawfalse进入该条件,则会将其设置为true,并执行if块。如果shouldDraw进入条件为真,它将被否定,并且将执行else块。

这将基本上在shouldDrawtrue之间切换false每次执行ActionListener,这会使光标闪烁。

答案 1 :(得分:5)

if (shouldDraw = !shouldDraw)

可以改写为

shouldDraw = !shouldDraw;
if (shouldDraw)

这是一种C风格的技巧,其中条件检查中的赋值可以使代码更加优雅,但它可能会让新程序员感到困惑

答案 2 :(得分:2)

它实际上并不是一个多余的条件,它只是“棘手”,“密集”,难以血腥读取代码!

棘手的一点是shouldDraw = !shouldDraw就是我所说的“触发器分配”。每次迭代都会为它的前任分配相反的内容,并执行备用。

太丑了!只是抱怨它,并且很高兴它不是你的代码; - )

干杯。基思。

答案 3 :(得分:1)

基本上这段代码将抽取2次中的1次。它会抹掉其他50%

有点混乱但合乎逻辑。