Что если я сделал явную ссылку на «this» для использования внутри внутреннего класса? - PullRequest
1 голос
/ 03 февраля 2011

До сих пор я использовал этот подход для доступа к this из области видимости внутреннего класса:

class FooManagementWindow extends JFrame {
  JButton rejectFoo;
  //...
  void getFooAcceptingPanel(){
    //...
    final FooManagementWindow referenceToThis = this;
    rejectFoo = new JButton("Reject");
    rejectFoo.addEventListener(new EventListener() {

      @Override
      public void actionPerformed(ActionEvent arg) {
        referenceToThis.setEnabled(false); //this requires a network call
        //...
        referenceToThis.setEnabled(true); //the user may resume his work
      }
    });                
    //...
  }
}

Однако я просто узнал , что вместо объявления referenceToThis, для меня сохраняется прямая ссылка:

FooManagementWindow.this

У меня нет оснований думать, что мой менее стандартный подход может привести к ошибкам или странным угловым случаям.Или есть?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

Нет ничего «неправильного» в том, как вы это делаете (кроме того, что оно нестандартно). По сути, это то же самое, что компилятор Java делает для вас за кулисами.

1 голос
/ 03 февраля 2011

Просто чтобы указать вам в другом направлении. Вы всегда можете изменить это:

rejectFoo.addEventListener(new EventListener() {

      @Override
      public void actionPerformed(ActionEvent arg) {
        referenceToThis.setEnabled(false); //this requires a network call
        //...
        referenceToThis.setEnabled(true); //the user may resume his work
      }
    });        

к этому:

rejectFoo.addEventListener(new EventListener() {

      @Override
      public void actionPerformed(ActionEvent arg) {
        rejectFooActionPerformed(arg);
      }
    });        

// ... after the getFooAcceptingPanel() method

public void rejectFooActionPerformed(ActionEvent arg) {
     setEnabled(false); //this requires a network call
     //...
     setEnabled(true); //the user may resume his work
}

Это работает, потому что вы можете вызвать this.method из своего внутреннего класса, а затем, когда вы пишете весь код действия в этом методе, вы находитесь в области действия вашего класса, а не во внутреннем классе, поэтому вам не нужно делать то, что вы заявили.

Просто пища для размышлений, я всегда предпочитаю такой подход, так как он немного чище. Поместить весь ваш код в анонимный внутренний класс - это грязно и не очень хорошая практика.

1 голос
/ 03 февраля 2011

Это хорошо, за исключением того, что это делает ваших слушателей больше на одну ссылку.Нет проблем, если у вас их много тысяч.

На самом деле, если вы не используете ни FooManagementWindow.this, ни что-либо из включающего экземпляра, компилятор теоретически может исключить неиспользуемую ссылку, чем ваш подходсвободно.Я не уверен, разрешено ли это делать, и сомневаюсь, что это так.Отладчик говорит, что это не так.

...