Ява - когда "это" единственный путь?
Следующий код выполняется для обоихvar = putVar;&this.var = putVar;
Я понимаю: "это" используется для идентификации этого - "поместите это значение только для" моего "объекта". Когда оба работают, почему люди обычно используют это в сеттерах?
код:
public class PlayingWithObjects
{
public static void main(String[] args)
{
SomeClass classObj = new SomeClass(10);
System.out.println("classObj.getVar: " + classObj.getVar() );
classObj.setVar(20);
System.out.println("classObj.getVar: " + classObj.getVar() );
classObj = new SomeClass(30);
System.out.println("classObj.getVar: " + classObj.getVar() );
}
}
class SomeClass
{
private int var;
public SomeClass(int putVar)
{
var = putVar;
}
public int getVar()
{
return var;
}
public void setVar(int putVar)
{
// var = putVar; // also works
this.var = putVar;
}
}
Я правильно понимаю "это"? Где "это" используется и не может быть заменено. Пожалуйста, отправьте код.
5 ответов
Потому что людям нравится использовать одно и то же имя переменной как для параметра метода, так и для переменной экземпляра - в этом случае вам нужно this
различать.
public void setX(int x) {
this.x = x;
}
Вы можете использовать this
если вы используете тот же идентификатор аргумента метода, что и в поле, но этого можно избежать, если вы просто не используете одно и то же имя.
Не используйте одно и то же имя - более распространенная практика, чтобы избежать путаницы и затенения. Следовательно, любая ссылка на this
в сеттер можно заменить лучшим стандартом именования: inParameter
, например.
public void setX(int inX) {
x = inX;
}
Другое использование this
было бы явно вызвать конструктор. Эта форма не может быть заменена более простым соглашением об именах:
public class Foo {
private String name;
public Foo() {
this("");
}
public Foo(String inName) {
name = inName;
}
}
Также может быть случай, когда вы захотите вернуть экземпляр, с которым работаете. Это также то, что this
позволяет делать:
return this;
Есть 2 случая, о которых я знаю, кроме упомянутого случая ktm (который, я думаю, очевиден, и вы уже знали):
Просто чтобы было очень ясно, что они ссылаются на член текущего объекта.
void foo(int x) { this.y = x; // No mistaking that y belongs to the object }
Если вы находитесь в анонимном внутреннем классе внутри другого объекта (например, класса ClassName), вы можете использовать ClassName.this, чтобы получить экземпляр включающего объекта. Причина этого (без каламбура) заключается в том, что внутри внутреннего класса это будет относиться к внутреннему классу.
SomeInnerClass myObj = new SomeInnerClass() { void bar() { this.y = 0; // this refers to the SomeInnerClass object OuterClass.this.y = 0; // OuterClass.this refers to the enclosing class OuterClass object } };
Как упоминалось в ktm, сеттеры обычно используют то же имя, что и поле для параметра. В этом случае параметр затеняет имя поля, поэтому
public void setX(int x) {
x = x;
}
будет просто установить параметр для себя, а не установить поле для параметра.
Если класс имеет переменную экземпляра с некоторым именем (скажем, myVar
), а метод имеет переменную LOCAL с точно таким же именем (myVar
), тогда любая ссылка на переменную будет ссылаться на локальную переменную. В таких случаях, если мы хотим указать переменную экземпляра класса, нам нужно сказать this.myVar
, Как указывалось ранее, это особенно полезно, когда нам нужны сеттеры, в которых имя параметра совпадает с переменной экземпляра, которую он устанавливает:
public void setMyVar(int myVar) {
this.myVar = myVar; // If we said myVar = myVar;, we'd just set the local
// variable to itself, which would NOT be what we want.
}