如果我明确引用“this”以在内部类中使用会怎样?

Posted

技术标签:

【中文标题】如果我明确引用“this”以在内部类中使用会怎样?【英文标题】:What if I made an explicit reference to 'this' for use inside an inner class? 【发布时间】:2011-02-03 15:14:44 【问题描述】:

到目前为止,我已经使用这种方法从内部类的范围内访问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
      
    );                
    //...
  

但是,我只是 learned,而不是声明 referenceToThis,而是为我保留了直接引用:

FooManagementWindow.this

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

【问题讨论】:

不,否则我没有时间回去更正所有实例。 嘿嘿,我也是这么用的,直到我发现 ClassName.this 东西 :) 【参考方案1】:

您的操作方式没有任何“错误”(除了它是非标准的事实)。这与 Java 编译器在幕后为您做的事情本质上是一样的。

【讨论】:

【参考方案2】:

这很好,除了它使您的听众大了一个参考。除非你有成千上万个,否则没问题。

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

【讨论】:

【参考方案3】:

只是为了给你指出另一个方向。您可以随时更改:

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,然后当您在此方法中编写所有操作代码时,您处于类的范围内而不是内部类,因此您不需要做你所说的。

只是深思熟虑,我总是更喜欢这种方法,因为它更干净一些。将所有代码放在匿名内部类中很麻烦,而且不是好习惯。

【讨论】:

实际上,我在以前的一个较小的项目中尝试的是在公共类之外创建一堆私有类,然后通过参数传递它们。无论如何,我希望 Java 支持直接传递函数而不必将它们封装到对象中。 好吧,如果 Java 7 发布,您的愿望可能会实现! wiki.java.net/bin/view/JDK/ClosuresSyntaxInJava7 编辑:Oracle 说发布日期是 2011 年 7 月 28 日。希望这是真的。

以上是关于如果我明确引用“this”以在内部类中使用会怎样?的主要内容,如果未能解决你的问题,请参考以下文章

四种内部类

在内部类中使用结构时编译错误

在内部类中执行main方法[重复]

为啥在内部类中使用公共方法?

Java之内部类的继承(附源码)

内部类