Этот вопрос уже имеет ответ здесь:
Какова наиболее успешная практика для использования 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();
Очевидно, плохой бит кода, но это иллюстрирует мой пример. Это просто снижается к персональному предпочтению в этих случаях?
, но Java достаточно умен, чтобы знать, что происходит, если я изменю оператор в конструкторе на
bar = bar;
FALSE! Он компилируется, но не делает того, что вы думаете!
Что касается того, когда его использовать, во многом это личные предпочтения. Мне нравится использовать this
в моих общедоступных методах, даже когда в этом нет необходимости, потому что именно там происходит взаимодействие, и приятно утверждать, что принадлежит мне, а что нет.
В качестве справки вы можете ознакомиться с Oracle's Java Tutorials по поводу this.subject; -)
http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
Вы должны использовать его, если у вас есть параметр с тем же именем, что и у поля, иначе вы столкнетесь с проблемами. Он будет компилироваться, но не обязательно делать то, что вы хотите.
Что касается всего остального, не используйте его, если это не нужно для удобства чтения. Если вы используете его повсюду, 20% вашего кода будет состоять из слова «это»!
public Foo(Bar bar) {
this.bar = bar;
}
не то же самое, что
public Foo(Bar bar) {
bar = bar;
}
Во втором случае полоса в области видимости является параметром, поэтому вы присваиваете его самой себе. this.bar
остается нулевым
.
это
ключевое слово относится к объекту класса, для которого вызывается какой-либо метод.
Например:
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
относится к объекту текущего класса.
Это личное предпочтение - выберите стиль и придерживайтесь его. Я лично использую это
, но другие считают, что это избыточно.
Личное предпочтение, но я использую его только для устранения двусмысленностей, и я полагаю, в очень редких случаях, чтобы сделать очевидным, что назначенная переменная является полем. Есть проекты, в которых люди используют this.field для каждой ссылки на поле. Я считаю, что эта практика визуально отвлекает до такой степени, что становится неприятной, но вы должны быть готовы время от времени видеть такой код.
Я втайне думаю, что в аду есть особое место для людей, которые пишут классы из 500 строк, в которых есть 275 ключевых слов this, но этот стиль можно найти в некоторых проектах с открытым исходным кодом, так что каждому свое, я думаю.
Я всегда стараюсь использовать ключевое слово 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;
}
}
}
Используйте его для клонирования объектов (путем передачи ссылки на себя через конструктор копирования).
Полезно для объекта, наследуемого 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.
}
}
На самом деле
baz = baz
вызовет это предупреждение
Присваивание переменной baz не имеет эффекта
Итак, что вы думаете неверно, локальная область видимости переопределяет атрибут класса, поэтому вы ДОЛЖНЫ использовать ключевое слово this
явно для назначения переменной атрибуту класса.
В противном случае переменная, учитываемая при присваивании, - это просто переменная, переданная в качестве параметра, а переменная класса игнорируется. Вот почему this
полезен, это не факт удобочитаемости, это факт явного решения о том, о каком baz
вы говорите.
Я бы сказал
, что использование
this
везде, где его не использовать, вызовет двусмысленность (или предупреждение компилятора, что более важно), в противном случае просто оставьте это. Поскольку его цель состоит в том, чтобы решить двусмысленность, когда допущений по умолчанию (сначала проверка локальных переменных, затем проверка атрибутов класса) недостаточно.
В зависимости от соглашения вы можете использовать его для удобства чтения. Он подчеркивает тот факт, что это объектная переменная.
Мне также нравится иметь аргументы установщика с тем же именем, что и переменная (выглядит лучше в сигнатуре метода). В этом случае вам понадобится , это
.