Есть ли разница между вызовами this.method()
и method()
(включая разницу в производительности)?
В Java, в чем разница между this.method() и методом()?
Ответ 1
Единственный раз, когда это важно, - если вы используете OuterClass.this.method()
, например.
class OuterClass {
void method() { }
class InnerClass {
void method() {
OuterClass.this.method(); // not the same as method().
}
}
}
Ответ 2
Нет абсолютно никакой разницы между этими конструкциями, и сгенерированный байт-код будет точно таким же, следовательно, влияние производительности не будет. this
разрешается во время компиляции, если явно не определено.
Единственная причина использования явного this
- читаемость - некоторым людям легче читать, потому что this
предполагает, что это метод экземпляра текущего объекта.
Также обратите внимание, что если method()
является статическим, использование this
обескураживает и вводит в заблуждение.
private static void method() {
}
private void foo() {
this.method(); //generates warning in my IDE for a reason
}
И в этом случае это также не повлияет на производительность.
Ответ 3
То, что нет разницы, можно увидеть, вызвав 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
}
Ответ 4
Для методов нет разницы, но это может иметь значение для полей. Рассмотрим этот код:
private String someObject = "some value";
public String someMethod(String someObject) {
//this.someObject refers to the field while
//someObject refers to the parameter
}
Ответ 5
Нет никакой реальной разницы. По крайней мере, нет влияния на производительность. Я предпочитаю не писать "this" - IDE обычно может выделять вызовы для этого в любом случае, и я думаю, что это менее читаемо, когда каждый доступ к методам/полям/... начинается с "this". Но это действительно вопрос личных предпочтений.
Ответ 6
Нет никакой разницы, кроме читаемости. Это делает его более понятным для читателя.
Ответ 7
Использовать this.method()
и/или this.myVar
или нет - на методах нет никакой разницы, на vars может быть - но будьте последовательны в этом. Я вижу, что он посыпал весь код, иногда даже вижу this.m_myClassVar
.
Лично я предпочитаю префикс моих классов vars простым подчеркиванием и помещать конечное подчеркивание в свой аргумент метода:
public MyClass
{
private int _myInt;
public void myMethod(final int myInt_, final int fooFactor_)
{
_myInt = myInt_ * fooFactor_;
}
}
Хотя большинство IDE дадут понять, что именно, я нахожу, что это имеет тенденцию предотвращать неправильное назначение и упрощает чтение намерений кода и IMO.
Я использую _thisInstance.myMethod()
(где _thisInstance
является ссылкой на внешний класс) или _thisInstance._myVar
, во внутренних классах/слушателях/потоках/и т.д. где мне нужно четко указать, какой метод я вызываю и/или где мне нужно иметь ссылку на экземпляр класса.
Ответ 8
Использование this.method() позволяет понять, что функция, связанная с экземпляром класса, вызывается, в отличие от статической функции или функции, принадлежащей другому объекту.
Это в духе тех разработчиков на С++, которые предпочитают добавлять "m_" ко всем переменным-членам в классе. Это делает собственность однозначной. Мне нравится это, но это не так важно, когда вы используете среду IDE, которая проясняет такие вещи, используя цвета и шрифты.
Ответ 9
Вы пытались сделать this.variable в конструкторе?
В теории, в С++, поскольку объект еще не создан, этого нет. Я не уверен в этом случае на Java.