“this” reference escaping during construction?

前端 未结 4 2036
无人共我
无人共我 2020-12-07 04:07

If I do the following,

final class FooButton extends JButton{
    FooButton(){
        super(\"Foo\");
        addActionListener(new ActionListener(){
               


        
相关标签:
4条回答
  • 2020-12-07 04:39

    Yes, because in the anonymous inner class you could access it like this:

    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
                }
            });
        }
    }
    

    The code of the anonymous ActionListener could in principle be called and use the FooButton before the FooButton object is fully initialized.

    0 讨论(0)
  • 2020-12-07 04:39

    Yes, the anonymous inner class of ActionListener has a reference to this.

    0 讨论(0)
  • 2020-12-07 04:40

    Yes. this of the enclosing class is implicitly in an non-static anonymous class.

    0 讨论(0)
  • 2020-12-07 04:52

    Yes, the this reference escapes to the listener. Since this listener is not really an external class, I don't see any problem with it, though.

    Here's where you could see that this escapes:

    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");
        }
    }
    
    0 讨论(0)
提交回复
热议问题