Какие есть применения у this в Java?

181
31 августа 2018, 11:40

Я знаю он возвращает ссылку на текущий объект, и с его помощью можно разрешить конфликт локальных и глобальных имен, например в конструкторе. Но какие есть более практичные применения?

Answer 1

В общем применение оператора this можно обобщить до следующего:

  1. Обращение к не статичным полям класса.
  2. Получение текущего объекта.
  3. Для решения конфликтов локальных и глобальных.
  4. Вызов другого конструктора из конструктора.

К примерам. Использование this в конструкторе:

class Person{
String name;
int old;
int id;
Person(String name, int old){
    this.name = name;//Здесь мы получаем доступ к не статичному полю класса
    this.old = old; // Здесь мы получаем доступ полю класса
}
}

Пример вызова конструктора из конструктора:

Person (String name, int old, int id){
    this(name, old);
    this.id = id;
}

Здесь мы получаем доступ к не статичному полям класса. В методах типа equals ():

@Override
public boolean equals(Object obj) {
    if(obj == null) return false;
    Person other = (Person) obj;
    if(this.old == other.old && this.name.equals(other.name))
        return true;
    return false;
}

Для создания потока:

class MyThread implements Runnable{
String name;
Thread t;
public MyThread(String name){
    this.name = name;
    t=new Thread(this); /* Здесь мы передаем экземпляр класса,
                              в котором будут разворачиваются действо. */
    t.setName(name);
    t.start();
}
public void run(){
    for (int i = 0; i < 5; i++) {
        System.out.println(name+": "+i);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            System.out.println(e);
            return;
        }
    }
}
}

Для получения аннотаций:

Annotation [] getAnnotation (){
    return this.getClass().getAnnotations();
}

И множество других примеров использования.

Answer 2

Например паттерн Builder почти во всех методах для возврата того же объекта использует везде this.

Answer 3

Например, когда внутри метода текущего объекта класса нужно передать текущий объект (this) в метод другого класса.

Пример:

class Example {
    public static void main (String[] args) throws java.lang.Exception {
        Point p = new Point();
        p.moveTo(1, 1);
        System.out.println(p); // 1x1
        Utils.plus(p, 2, -1);
        System.out.println(p); // 3x0
    }
}
class Point {
    int x;
    int y;
    public void moveTo(int x, int y) {
        Utils.plus(this, x, y);
    }
    public String toString() {
        return String.format("%sx%s", x, y);
    }
}
class Utils {
    public static void plus(Point p1, int x, int y) {
        p1.x += x;
        p1.y += y;
    }
}
Answer 4

Доступ к начинке внутренних нестатических классов: Vehicle.this.run();...

READ ALSO
Не работает Comparator по нескольким полям

Не работает Comparator по нескольким полям

В FullComparator не работает сортировка по нескольким полям (channelName, DateCreated (в обратном порядке) и Fingerprint)Сортирует только по первому

180
Как форматировать дату с таймзоной в просто дату?

Как форматировать дату с таймзоной в просто дату?

Как получить из этой строки 2018-07-11T09:54:40660 +0000 обьект Date?

152
ExecutorService+GreenMail

ExecutorService+GreenMail

Тестирую отправку сообщений с помощью JavaMailSender, который запускается из ExecutorService с помощью submit, все работает отлично, но в тестах GreenMail не получает...

153
Непонятный код, цикл и поля

Непонятный код, цикл и поля

Цикл: for (j = 2; j < i; j++), в чем заключается j<iКак это понять? Откуда мы придумали j?

194