«эта» ссылка ускользает во время строительства? - PullRequest
3 голосов
/ 09 декабря 2011

Если я сделаю следующее,

final class FooButton extends JButton{
    FooButton(){
        super("Foo");
        addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                // do stuff
            }
        });
    }
}

я позволяю ссылке this неявно скрыться?

Ответы [ 4 ]

7 голосов
/ 09 декабря 2011

Да, эта ссылка ускользает от слушателя.Поскольку этот слушатель на самом деле не является внешним классом, я не вижу никаких проблем с ним.

Здесь вы можете увидеть, что это ускользает:

final class FooButton extends JButton{
    Foo(){
        super("Foo");
        addActionListener(new ActionListener(){
            private buttonText = FooButton.this.getText(); // empty string

            @Override
            public void actionPerformed(ActionEvent e){
                // do stuff
            }
        });
        this.setText("Hello");
    }
}
6 голосов
/ 09 декабря 2011

Да, потому что в анонимном внутреннем классе вы можете получить к нему следующий доступ:

final class FooButton extends JButton {
    Foo() {
        super("Foo");
        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                FooButton button = FooButton.this;
                // ... do something with the button
            }
        });
    }
}

Код анонимного ActionListener в принципе можно вызвать и использовать FooButton до полной инициализации объекта FooButton.

1 голос
/ 09 декабря 2011

Да.this включающего класса неявно входит в нестатический анонимный класс.

1 голос
/ 09 декабря 2011

Да, анонимный внутренний класс ActionListener имеет ссылку на this.

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