我在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();
答案 0 :(得分:12)
if (shouldDraw = !shouldDraw)
那不是if(shouldDraw != shoundDraw)
。我认为这让你感到困惑。相反,它会对shouldDraw
进行否定并检查结果是什么。
因此,功能是如果shouldDraw
曾false
进入该条件,则会将其设置为true
,并执行if
块。如果shouldDraw
进入条件为真,它将被否定,并且将执行else块。
这将基本上在shouldDraw
和true
之间切换false
每次执行ActionListener
,这会使光标闪烁。
答案 1 :(得分:5)
if (shouldDraw = !shouldDraw)
可以改写为
shouldDraw = !shouldDraw;
if (shouldDraw)
这是一种C风格的技巧,其中条件检查中的赋值可以使代码更加优雅,但它可能会让新程序员感到困惑
答案 2 :(得分:2)
它实际上并不是一个多余的条件,它只是“棘手”,“密集”,难以血腥读取代码!
棘手的一点是shouldDraw = !shouldDraw
就是我所说的“触发器分配”。每次迭代都会为它的前任分配相反的内容,并执行备用。
太丑了!只是抱怨它,并且很高兴它不是你的代码; - )
干杯。基思。
答案 3 :(得分:1)
基本上这段代码将抽取2次中的1次。它会抹掉其他50%
有点混乱但合乎逻辑。