Резервное состояние - PullRequest
6 голосов
/ 29 мая 2011

У меня есть проблема в этом блоке кода, который я видел на сайте оракулов.Может кто-нибудь объяснить это для меня?

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 ]

12 голосов
/ 29 мая 2011
if (shouldDraw = !shouldDraw)

Это не делает if(shouldDraw != shoundDraw).Я думаю, это то, что вас смущает.Вместо этого он делает отрицание на shouldDraw и проверяет, каков был результат.

Итак, функциональность такова, что если shouldDraw когда-либо false входил в это условие, он будет установлен вtrue, и блок if будет выполнен.Если shouldDraw перешел в условие как истинное, оно будет отменено, и будет выполнен блок else.

Это будет по существу переключать shouldDraw между true и false при каждом выполненииActionListener, который заставит курсор мигать.

5 голосов
/ 29 мая 2011
if (shouldDraw = !shouldDraw)

можно переписать как

shouldDraw = !shouldDraw;
if (shouldDraw)

это трюк в стиле C, где присваивание при проверке условий может сделать более элегантный код, но это может сбить с толку нового программиста

2 голосов
/ 29 мая 2011

Это на самом деле не избыточное условие, это просто "хитрый", "плотный", трудно читаемый код!

Хитрость в том, что shouldDraw = !shouldDraw это то, что я называю "триггером НАЗНАЧЕНИЕ"».Каждая итерация назначит противоположность своему предшественнику и выполнит альтернативу.

Это ужасно!Просто возьми это и будь рад, что это не твой код; -)

Ура.Кит.

1 голос
/ 29 мая 2011

в основном этот фрагмент кода будет рисовать 1 из 2 раз.и это сотрет остальные 50%

немного запутанно, но логично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...