我已经在SO和其他地方的许多Android代码中使用ClassName.this
在线(而不是简单的this
关键字)来引用类的当前实例。我知道你可能会决定在课程名称前添加this
以消除任何歧义,但根据我的经验,这样做通常是不必要的,因为this
只能提到一件事 - 代码正在执行的类的当前实例。是否有其他我忽略的建议将this
关键字与类名称接口始终是更好的做法,或者是否存在任何情况,事实上,有必要吗?
答案 0 :(得分:27)
答案 1 :(得分:10)
这实际上只有一件事。
这是不正确的。
还有其他我忽略的东西会建议将此关键字与类名称对接,这总是更好的做法,还是在任何情况下都是必要的?
分别是和是。特别是,内部类需要ClassName.this
才能到达this
的外部类实例。
例如:
myButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
startActivity(new Intent(MyActivity.this, MyOtherActivity.class));
}
});
此处,使用this
代替MyActivity.this
将因编译错误而失败,并抱怨Button.OnClickListener
不是Intent
构造函数的有效第一个参数。 MyActivity.this
返回this
,它是包含MyActivity
实例的Button.OnClickListener
实例。
答案 2 :(得分:0)
我没有那么多回购来发表评论,所以把它写下来作为答案。
我认为这个问题的基本关注点是检查使用classname.this是否有任何优势,而不是这个'在开发人员已经知道不会有任何内部类调用的场景中的关键字。
当然在内部类场景的情况下,你必须使用classname.this来调用它的封闭类。但是你可能已经知道这个特殊的代码不会被任何内部类调用。所以为什么要指定classname.this,而只是使用'这个'。
答案 3 :(得分:0)
Window win = SwingUtilities.getWindowAncestor(RedPanel.this);
通常你会在内部类中看到这样的代码。所以说你有一个名为RedPanel的类,它是JPanel的子类,并且在内部说你有一个实现ActionListener的匿名内部类。如果要引用ActionListener中的“this”RedPanel对象,则不能仅使用“this”,因为它引用的是ActionListener而不是RedPanel。要获得RedPanel“this”的句柄,您需要使用RedPanel.this。