Java 如果我显式引用“this”以便在内部类中使用会怎么样?

Java 如果我显式引用“this”以便在内部类中使用会怎么样?,java,inner-classes,Java,Inner Classes,到目前为止,我已经使用这种方法从内部类的范围访问它: class FooManagementWindow extends JFrame { JButton rejectFoo; //... void getFooAcceptingPanel(){ //... final FooManagementWindow referenceToThis = this; rejectFoo = new JButton("Reject"); rejectFoo.add

到目前为止,我已经使用这种方法从内部类的范围访问它:

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
      }
    });                
    //...
  }
}
然而,我只是想说,我没有声明引用这一点,而是为我保留了一个直接引用:

FooManagementWindow.this

我没有理由认为我不太标准的方法可能会导致错误或奇怪的情况。或者有吗?

这很好,只是它会让你的听众在一次引用中变大。没问题,除非你有成千上万个


实际上,如果您既不使用FooManagementWindow.this,也不使用封闭实例中的任何内容,编译器理论上可以消除未使用的引用,而您的方法将是免费的。我不确定,它是否被允许这样做,我怀疑它是否做到了。调试器说它不会。这没关系,只是它会使您的侦听器增大一个引用。没问题,除非你有成千上万个


实际上,如果您既不使用FooManagementWindow.this,也不使用封闭实例中的任何内容,编译器理论上可以消除未使用的引用,而您的方法将是免费的。我不确定,它是否被允许这样做,我怀疑它是否做到了。调试器说它没有问题。

除了它是非标准的之外,您的操作方式没有任何“错误”。这与Java编译器在幕后为您所做的事情基本相同。

除了它是非标准的之外,您所做的方式没有任何“错误”。它本质上与Java编译器在幕后为您所做的事情相同。

只是为您指出另一个方向。您可以随时更改此选项:

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,然后当您使用此方法编写所有操作代码时,您处于类的作用域中,而不是内部类,因此不需要执行您所声明的操作


值得思考的是,我总是喜欢这种方法,因为它更干净一些。将所有代码放在匿名内部类中是一种混乱的做法。

只是为您指明了另一个方向。您可以随时更改此选项:

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,然后当您使用此方法编写所有操作代码时,您处于类的作用域中,而不是内部类,因此不需要执行您所声明的操作


值得思考的是,我总是喜欢这种方法,因为它更干净一些。把你所有的代码放在一个匿名的内部类中是很混乱的,也不是很好的做法。

不,我没有时间回去纠正所有的实例。呵呵,在我找到类名之前,我也是这么用的。这些东西:不,我没有时间回去纠正所有的实例。呵呵,这就是我在发现ClassName之前一直使用的方法。这些东西:实际上,我在一个较小的、以前的项目中尝试的是在公共类之外创建一组私有类,然后通过参数传递它们。无论如何,我希望Java支持直接传递函数,而不必将它们封装到对象中!编辑:甲骨文称发布日期为2011年7月28日。让我们希望这是真的。事实上,我在一个较小的、以前的项目中尝试的是在公共类之外创建一组私有类,然后通过参数传递这些类。无论如何,我希望Java支持直接传递函数,而不必将它们封装到对象中!编辑:甲骨文称发布日期为2011年7月28日。但愿那是真的。