Ява - когда "это" единственный путь?

Следующий код выполняется для обоих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 (который, я думаю, очевиден, и вы уже знали):

  1. Просто чтобы было очень ясно, что они ссылаются на член текущего объекта.

    void foo(int x) {
        this.y = x; // No mistaking that y belongs to the object
    }
    
  2. Если вы находитесь в анонимном внутреннем классе внутри другого объекта (например, класса 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.
}
Другие вопросы по тегам