Подтвердить что ты не робот

В Java, в чем разница между this.method() и методом()?

Есть ли разница между вызовами this.method() и method() (включая разницу в производительности)?

4b9b3361

Ответ 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.