【发布时间】:2011-09-26 16:48:09
【问题描述】:
调用this.method()和method()有什么区别(包括性能区别)?
【问题讨论】:
调用this.method()和method()有什么区别(包括性能区别)?
【问题讨论】:
唯一重要的是您是否使用OuterClass.this.method(),例如
class OuterClass {
void method() { }
class InnerClass {
void method() {
OuterClass.this.method(); // not the same as method().
}
}
}
【讨论】:
这些构造之间绝对没有区别,并且生成的字节码将完全相同,因此不会影响性能。 this 如果未显式定义,则会在编译期间解析。
使用显式this 的唯一原因是可读性——有些人发现它更容易阅读,因为this 暗示这是当前对象的实例方法。
另外请注意,如果method() 是静态的,则不鼓励使用this 并具有误导性。
private static void method() {
}
private void foo() {
this.method(); //generates warning in my IDE for a reason
}
在这种情况下,它也不会影响性能。
【讨论】:
static 方法的含义。
在命令行上调用javap -c ClassName 可以看出没有区别。
例如:
public class This {
private void method() {
}
public void noThis() {
method();
}
public void useThis() {
this.method();
}
}
产生以下反汇编输出:
Compiled from "This.java"
public class This extends java.lang.Object{
public This();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public void noThis();
Code:
0: aload_0
1: invokespecial #2; //Method method:()V
4: return
public void useThis();
Code:
0: aload_0
1: invokespecial #2; //Method method:()V
4: return
}
【讨论】:
this的那几微秒。
对于方法没有区别,但它可以对字段产生影响。考虑这段代码:
private String someObject = "some value";
public String someMethod(String someObject) {
//this.someObject refers to the field while
//someObject refers to the parameter
}
【讨论】:
没有真正的区别 - 至少对性能没有影响。我不喜欢写“this”——IDE 通常可以突出显示对 this 的调用,而且我认为当每次访问方法/字段/...都以“this.”开头时,它的可读性会降低。但这确实是个人喜好问题。
【讨论】:
除了可读性之外没有任何区别。它使读者更清楚。
【讨论】:
this 的信息是多余的,因为它是隐含的。它可能对新手有所帮助,但对于(大多数)更有经验的编码人员来说很烦人。
使用 this.method() 和/或 this.myVar 或不使用 - 在方法上没有区别,在 vars 上可能有 - 但要保持一致。我看到它遍布整个代码,有时我什至看到this.m_myClassVar。
就我个人而言,我更喜欢在我的类 vars 前加上一个简单的下划线,并在我的方法 args 上加上一个尾随下划线:
public MyClass
{
private int _myInt;
public void myMethod(final int myInt_, final int fooFactor_)
{
_myInt = myInt_ * fooFactor_;
}
}
虽然大多数 IDE 会明确哪个是哪个,但我发现这有助于防止分配错误,并使代码的意图更清晰,IMO 更易于阅读。
我确实在内部类/侦听器/线程/等中使用_thisInstance.myMethod()(其中_thisInstance 是对外部类的引用)或_thisInstance._myVar。我需要清楚我在哪个类上调用什么方法和/或我需要在哪里引用一个类实例。
【讨论】:
使用 this.method() 可以清楚地表明正在调用与类实例关联的函数,而不是静态函数或属于另一个对象的函数。
这符合那些喜欢在类中的所有成员变量前面加上“m_”的 C++ 开发人员的精神。它使所有权明确。我倾向于喜欢它,但是当您使用使用颜色和字体来阐明此类内容的 IDE 时,它并不那么重要。
【讨论】:
你试过在构造函数中做 this.variable 吗?
理论上,在 C++ 中,由于尚未创建对象,因此没有 this。我不确定 Java 中的情况。
【讨论】:
this.foo = foo; 是一种非常常见的模式,用于从同名参数初始化字段(成员变量)。