Когда целесообразно использовать "this" в Java
Возможный дубликат:
Когда мне следует использовать "this" в классе?
Как узнать, следует ли использовать "this" при обращении к полю экземпляра?
например:
return this.name
Мне научили один случай, когда он полезен. т.е. когда входной параметр совпадает с именем поля:
public void setName(String name) {
this.name = name;
}
Кроме этого, "this" кажется ненужным.. Какие еще случаи?
Ответы
Ответ 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 говорит об этом подробнее.