Подтвердить что ты не робот

Когда целесообразно использовать "this" в Java

Возможный дубликат:
Когда мне следует использовать "this" в классе?

Как узнать, следует ли использовать "this" при обращении к полю экземпляра?

например:

return this.name

Мне научили один случай, когда он полезен. т.е. когда входной параметр совпадает с именем поля:

public void setName(String name) {
    this.name = name;
}

Кроме этого, "this" кажется ненужным.. Какие еще случаи?

4b9b3361

Ответ 1

Если у вас слишком много конструкторов для класса, вы можете использовать this для вызова других конструкторов. Пример:

public class TeleScopePattern {

    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;

    public TeleScopePattern(int servingSize, int servings) {
        this(servingSize, servings, 0);

    }

    public TeleScopePattern(int servingSize, int servings, int calories) {
        this(servingSize, servings, calories, 0);

    }

    public TeleScopePattern(int servingSize, int servings, int calories, int fat) {

        this.servingSize = servingSize;
        this.servings = servings;
        this.calories = calories;
        this.fat = fat;

    }

}

Ответ 2

Вы должны использовать это в нескольких случаях:

  • когда у вас одинаковые имена поля и параметр метода/локальная переменная, и вы хотите прочитать/записать поле

  • когда вы хотите получить доступ к полю внешнего класса из внутреннего класса:

    class Outer {
    
        private String foo;
    
        class Inner {
            public void bar() {
                 System.out.println(Outer.this.foo);
            }
        }
    }
    
  • Если вы хотите вызвать один конструктор из другого (но скорее как вызов метода - this(arg1, arg2);

Все другие обычаи - только вопрос стиля.

Ответ 3

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

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

public class MyClass {

    private Integer value = 0; //Assume this has setters and getters

    public void incrementValue() {
        Incrementer.addOne(this);
    }

}

И класс incrementer имеет такой метод, как этот:

public static void addOne(MyClass classToIncrement) {
    Integer currentValue = classToIncrement.getValue();
    currentValue++;
    classToIncrement.setValue(currentValue);
}

Для получения дополнительной информации, проверьте документацию.

Ответ 4

Fluent Interface pattern по существу означает возврат this из методов setter, позволяющий вам "цепочки" вызовов методов.

StringBuilder является одним из примеров из JDK, имеющего свободный интерфейс. Вот как это работает:

int count = 5;
StringBuilder sb = new StringBuilder();
String result = sb.append("The total is ").append(count).append(".").toString(); 

Последняя строка выше эквивалентна:

sb.append("The total is ");
sb.append(count);
sb.append(".");
String result = sb.toString();

но приводит к меньшему и, возможно, более читабельному коду.

Реализации различных методов append() возвращаются this.

Ответ 5

В большинстве случаев, когда речь идет о методах или атрибутах внутри класса, это необязательно. Тем не менее он улучшает читаемость, давая понять, что переменная хранится в области класса вместо области действия.

Ответ 6

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

Читайте здесь для получения дополнительной информации и некоторых примеров.

Ответ 7

Я не знаю, кто научил вас таким образом, но, насколько мне известно, this является ссылкой на текущий объект.

returnType method(dataType val){
dataType myVariable = someOperation(this.val);
return myVariable;
}

docs.oracle.com говорит об этом подробнее.