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日。但愿那是真的。