Java - когда использовать 'это' ключевое слово [дубликат]

Этот вопрос уже имеет ответ здесь:

Какова наиболее успешная практика для использования 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();

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

68
задан jackbot 11 March 2010 в 22:11
поделиться

10 ответов

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

  bar = bar; 
 

FALSE! Он компилируется, но не делает того, что вы думаете!

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

В качестве справки вы можете ознакомиться с Oracle's Java Tutorials по поводу this.subject; -)

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

76
ответ дан 24 November 2019 в 14:14
поделиться

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

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

14
ответ дан 24 November 2019 в 14:14
поделиться
public Foo(Bar bar) {
     this.bar = bar;
}

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

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

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

6
ответ дан 24 November 2019 в 14:14
поделиться

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

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 вместо new Abc () , потому что если мы передадим здесь new Abc () , он будет вызывать себя снова и снова.

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

class Abc {
    int a;

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

Здесь this.a относится к переменной a класса Abc. Следовательно, имеет тот же эффект, что и при использовании new Abc (). A; .

Итак, вы можете сказать this относится к объекту текущего класса.

10
ответ дан 24 November 2019 в 14:14
поделиться

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

3
ответ дан 24 November 2019 в 14:14
поделиться

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

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

1
ответ дан 24 November 2019 в 14:14
поделиться

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

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

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

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

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

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;
    }
  }
}
2
ответ дан 24 November 2019 в 14:14
поделиться

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

Полезно для объекта, наследуемого 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.
  }
}
0
ответ дан 24 November 2019 в 14:14
поделиться

На самом деле

baz = baz

вызовет это предупреждение

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

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

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

Я бы сказал

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

11
ответ дан 24 November 2019 в 14:14
поделиться

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

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

3
ответ дан 24 November 2019 в 14:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: