Использование “этого” в Java

Я бы придерживался запроса у вас использовать оконные функции:

SELECT brewery_name, ibu, avg_ibu
FROM (SELECT br.name as brewery_name, ibu,
             AVG(ibu) OVER (PARTITION BY b.brewery_id ORDER BY ibu DESC) as avg_ibu,
             COUNT(ibu) OVER (PARTITION BY b.brewery_id) as cnt_ibu
      FROM beers b JOIN
           breweries br
          ON b.brewery_id = br.brewery_id
      WHERE ibu IS NOT NULL
     ) bb
WHERE cnt_ibu >= 5;
7
задан Jean-François Corbett 11 May 2015 в 08:09
поделиться

13 ответов

Если Вы не запишете "this.variable" в своем конструкторе, и если у Вас будет локальная переменная (включая параметр функции) с тем же именем как Ваша полевая переменная в конструкторе, то локальную переменную рассмотрят; тени локальной переменной поле (иначе переменная класса).

Одно место, где "это" - единственный способ пойти:

class OuterClass {
  int field;

  class InnerClass {
    int field;

    void modifyOuterClassField()
    {
      this.field = 10; // Modifies the field variable of "InnerClass"
      OuterClass.this.field = 20; // Modifies the field variable of "OuterClass",
                                  // and this weird syntax is the only way.
    }
  }
}
31
ответ дан 6 December 2019 в 04:45
поделиться

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

j = j;

просто присваивает значение аргумента j к аргументу j (который является довольно бессмысленным, но тем не менее допустимый оператор).

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

Другое использование this когда необходимо передать ссылку на текущий объект к некоторому методу, такому как это:

someObject.addEventListener(this);

В этом примере необходимо обратиться к текущему объекту в целом (вместо просто члена объекта).

10
ответ дан 6 December 2019 в 04:45
поделиться

Если Вы не пишете это, то Вы присваиваете аргумент себе; тень переменных аргумента переменные экземпляра.

6
ответ дан 6 December 2019 в 04:45
поделиться

это полезно, когда Вы хотите возвратить сам объект

return this;

Это полезно, потому что, если класс имеет, например, Method1 () и Method2 (), оба возврата этого, Вам разрешают записать вызовы как

object.Method1().Method2()

Также в методе может быть полезно передать сам объект другой функции, во время вызова.

5
ответ дан 6 December 2019 в 04:45
поделиться

Другой полезный подход (хотя редко используется) должен объявить финал параметров метода:

Следующий блок не скомпилирует, таким образом предупредив Вас к ошибке сразу:

  public Example(final int j, final int k) {
       j = j;
       k = k;
  }
5
ответ дан 6 December 2019 в 04:45
поделиться

В Вашем коде конструктора Вы присваиваете переменные себе. 'j' является j, указанным в аргументе в пользу конструктора. Даже если это была переменная класса j определенный выше, то Вы все еще говорите "j = j"..., т.е. j не собирается оценивать по-другому слева и справа.

  public Example(int j, int k) {
       this.j = j;
       this.k = k;
  }
3
ответ дан 6 December 2019 в 04:45
поделиться

То, что Вы испытываете, называют переменным затенением. Взгляните на этот обзор для различных видов переменных в Java.

Вообще говоря: компилятор Java использует ближайшую переменную, которую он может найти для присвоения. В методе это сначала попытается найти локальную переменную и затем увеличить фокус ее поиска к переменным класса и переменным экземпляра.

Одна привычка, которую я лично нахожу хорошими (другим не нравится она) снабжает префиксом членскую переменную m_ и использует верхний регистр для CONSTANT_VARIABLES, которые не изменяют их значение. Код, где переменное затенение используется нарочно, очень (!) трудно отладить и работать с.

3
ответ дан 6 December 2019 в 04:45
поделиться

Точно так же, как Robert Grant сказал, 'это' - то, как Вы проясняете, что обращаетесь к членской переменной вместо локальной переменной.

1
ответ дан 6 December 2019 в 04:45
поделиться

Вы присваиваете параметр себе в Вашем примере.

В более общем плане разговор: Если Вы не предварительно ожидаете объем к своей переменной, текущая область принята - который является функцией в Вашем случае. 'this.j' говорит jre использовать переменную j в области объекта - членская переменная объекта.

2
ответ дан 6 December 2019 в 04:45
поделиться

Для ответа на последующий вопрос об этом с методом внутренний класс, упомянутый Srikanth, является все еще допустимым примером использования этого: (с методом на этот раз)

public class OuterClass
{
    void f() {System.out.println("Outer f()");};
    class InnerClass {
        void f() {
            System.out.println("Inner f()");
            OuterClass.this.f();
        }
    }
}

У Вас есть та же ситуация с анонимным классом:

Можно обратиться к методам внешнего класса:

  • MyOuterClass.this.yOuterInstanceMethod(),
  • MyOuterClass.myOuterInstanceMethod(),
  • или просто myOuterInstanceMethod() если нет никакой неоднозначности.
1
ответ дан 6 December 2019 в 04:45
поделиться

Это не вполне отвечает на Ваш вопрос, но если Вы используете Eclipse, Вы могли бы найти установку "Assignment has no effect" полезной. Я уверен, что это будет в других IDE также.

0
ответ дан 6 December 2019 в 04:45
поделиться

Возможно, вы захотите взять посмотрите на В чем преимущество наличия this / self указателя обязательного явного?
Хотя использование this не обязательно в Java, как вы заметили, я уверен, что прольет свет на тему использования this в Java.

0
ответ дан 6 December 2019 в 04:45
поделиться

Чтобы избежать этого, используйте IDE (например, Eclipse), и в этом случае она будет генерировать предупреждения.

Кроме того, сделайте ваши поля окончательными, если они абсолютно не могут быть. Для этого есть ряд причин (помимо этой).

0
ответ дан 6 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: