Java - когда использовать ключевое слово this

Какова наилучшая практика использования this ключевое слово в Java? Например, у меня есть следующий класс:

class Foo {
    Bar bar;

    public Foo(Bar bar) {
         this.bar = bar;
    }
}

Это нормально и все, но Java достаточно умен, чтобы знать, что происходит, если я изменю оператор в конструкторе на

 bar = bar;

Так зачем использовать this ключевое слово? (Я понимаю, что в некоторых ситуациях это абсолютно необходимо, я просто спрашиваю о подобных ситуациях). На самом деле, я склонен использовать ключевое слово исключительно для удобства чтения, но какова общая практика? Например, использование всего этого кода делает мой код немного запутанным

boolean baz;
int someIndex = 5;
this.baz = this.bar.getSomeNumber() == this.someBarArray[this.someIndex].getSomeNumber();

Очевидно, немного кода, но это иллюстрирует мой пример. Это просто личное предпочтение в этих случаях?

12 ответов

Решение

но Java достаточно умен, чтобы знать, что происходит, если я изменю выражение в конструкторе на

  bar = bar;

ЛОЖНЫЙ! Он компилируется, но не делает то, что вы думаете!

Что касается того, когда его использовать, то во многом это личное предпочтение. Я люблю использовать this в моих публичных методах, даже когда это не нужно, потому что именно там происходит взаимодействие, и приятно утверждать, что мое, а что нет.

В качестве справки вы можете ознакомиться с Обучающими курсами по Java для Oracle по этому вопросу;-)

http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

Вы должны использовать его, когда у вас есть параметр с тем же именем, что и у поля, иначе вы столкнетесь с проблемами. Он скомпилируется, но не обязательно будет делать то, что вы хотите.

Как и везде, не используйте его, если он не нужен для удобства чтения. Если вы используете его везде, 20% вашего кода будет состоять из слова "это"!

На самом деле

baz = baz

поднимет это предупреждение

Присвоение переменной баз не имеет никакого эффекта

То, что вы считаете неправильным, локальная область переопределяет атрибут класса, поэтому вы ДОЛЖНЫ использовать this Ключевое слово явно, чтобы назначить переменную атрибуту класса.

В противном случае переменная, учитываемая в присваивании, является той, которая передается в качестве параметра, а класс 1 игнорируется. Вот почему this полезно, это не факт читабельности, это факт явного baz ты о чем?

я бы сказал

использование this где бы он не использовался, это вызвало бы неоднозначность (или предупреждение компилятора, что более важно), иначе просто оставьте это. Поскольку его целью является именно то, чтобы решить неоднозначности, когда допущений по умолчанию (сначала проверьте локальные, а затем проверьте атрибуты класса) недостаточно.

this Ключевое слово относится к Объекту класса, для которого вызывается некоторый метод.
Например:

public class Xyz {  
    public Xyz(Abc ob)
    {
        ob.show();
    }
}

public class Abc {
    int a = 10;

    public Abc()
    {
        new Xyz(this);
    }

    public void show()
    {
        System.out.println("Value of a " + a);
    }

    public static void main(String s[])
    {
        new Abc();
    }
}

Здесь в Abc() мы звоним Xyz() который нуждается в объекте класса Abc.. Таким образом, мы можем передать this вместо нового Abc()потому что, если мы передадим новый Abc() здесь он будет называть себя снова и снова.

Также мы используем это, чтобы дифференцировать переменные класса и локальные переменные метода. например

class Abc {
    int a;

    void setValue(int a)
    {
        this.a = a;
    }
}

Вот this.a Это относится к переменной А класса Abc. Следовательно, имеет такой же эффект, как вы используете новый Abc().a;,

Так что можете сказать this ссылается на объект текущего класса.

Обычно это ключевое слово используется в явном вызове конструктора. Вы можете увидеть пример из документации.

public class Rectangle {
    private int x, y;
    private int width, height;

    public Rectangle() {
        this(0, 0, 1, 1);
    }
    public Rectangle(int width, int height) {
        this(0, 0, width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    ...
}
public Foo(Bar bar) {
     this.bar = bar;
}

это не то же самое, что

public Foo(Bar bar) {
     bar = bar;
}

Во втором случае строка в области видимости - это параметр, поэтому вы назначаете его себе. this.bar остатки null,

В зависимости от соглашения вы можете использовать его для удобства чтения. Это подчеркивает тот факт, что это объектная переменная.

Мне также нравится иметь аргументы сеттера с тем же именем, что и у переменной (лучше выглядит в сигнатуре метода). Тебе нужно this в этом случае.

Это личное предпочтение - выберите стиль и придерживайтесь его. Я лично пользуюсь this но другие думают, что это излишне.

Личные предпочтения, но я использую их только для устранения неясностей, и, как мне кажется, в очень редком случае очевидно, что назначенная переменная является полем. Есть несколько проектов, в которых люди используют "this.field" для каждой ссылки на поле. Я нахожу эту практику визуально отвлекающей до такой степени, что она отвратительна, но вы должны быть готовы видеть такой код время от времени.

Я тайно думаю, что в аду есть специальное место для людей, которые пишут 500 линейных классов, в которых есть 275 ключевых слов "this", но этот стиль встречается в некоторых проектах с открытым исходным кодом, так что я думаю, что каждому свой.

void set(int real)
{
    this.real = real;
}

Вот this это ключевое слово, используемое, когда переменная экземпляра совпадает с локальной переменной.
другое использование this перегрузка конструктора он может вызвать конструктор в перегруженном конструкторе.

Я всегда стараюсь использовать this ключевое слово на объектах локального класса.

Я использую его, чтобы визуально напомнить мне, является ли объект статическим объектом или объектом класса.

Это помогает мне и компилятору различать аргументы метода и объект локального класса.

public void setValue(int value){
  this.value = value;
}

Это помогает мне визуально напомнить, есть ли такой локальный объект во внутреннем / вложенном / анонимном классе, чтобы отличать его от инкапсулирующих объектов класса. Потому что, если нет this префикс, мое соглашение напомнит мне, что это объект инкапсулирующего класса

public class Hello{
  public int value = 0;
  public boolean modal = false;

  public class Hellee{
    public int value = 1;
    public getValue(){
      if (modal)
        return 0;
      return this.value;
    }
  }
}

Используйте его для клонирования объектов (передавая ссылку на себя через конструктор копирования).

Полезно для объекта, который наследует Cloneable,

public Foo implements Cloneable {
  private String bar;

  public Foo(Foo who) {
    bar = who.bar;
  }

  public Object getClone() {
    return new Foo(this);  //Return new copy of self.
  }
}
Другие вопросы по тегам