冗余条件

Moh*_*abi 6 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();
Run Code Online (Sandbox Code Playgroud)

jjn*_*guy 11

if (shouldDraw = !shouldDraw)
Run Code Online (Sandbox Code Playgroud)

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

因此,该功能是,如果shouldDraw是有史以来false进入这种状态,它会被设置为true,和if块将被执行.如果shouldDraw进入条件为真,它将被否定,并且将执行else块.

这将从根本上切换shouldDraw之间truefalse上的每个执行ActionListener,这将使光标闪烁.

  • 是的,虽然这完全显示了尝试聪明的东西的缺点,特别是在教程代码中. (3认同)
  • @Voo,是的,不应该在教程中. (3认同)

rat*_*eak 5

if (shouldDraw = !shouldDraw)
Run Code Online (Sandbox Code Playgroud)

可以改写为

shouldDraw = !shouldDraw;
if (shouldDraw)
Run Code Online (Sandbox Code Playgroud)

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