Я бы придерживался запроса у вас использовать оконные функции:
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;
Если Вы не запишете "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.
}
}
}
Если Вы говорите просто j
в Вашем конструкторе затем компилятор будет думать, что Вы имеете в виду аргумент в обоих случаях. Так
j = j;
просто присваивает значение аргумента j
к аргументу j
(который является довольно бессмысленным, но тем не менее допустимый оператор).
Таким образом для устранения неоднозначности этого можно снабдить префиксом this.
ясно дать понять, что Вы имеете в виду членскую переменную с тем же именем.
Другое использование this
когда необходимо передать ссылку на текущий объект к некоторому методу, такому как это:
someObject.addEventListener(this);
В этом примере необходимо обратиться к текущему объекту в целом (вместо просто члена объекта).
Если Вы не пишете это, то Вы присваиваете аргумент себе; тень переменных аргумента переменные экземпляра.
это полезно, когда Вы хотите возвратить сам объект
return this;
Это полезно, потому что, если класс имеет, например, Method1 () и Method2 (), оба возврата этого, Вам разрешают записать вызовы как
object.Method1().Method2()
Также в методе может быть полезно передать сам объект другой функции, во время вызова.
Другой полезный подход (хотя редко используется) должен объявить финал параметров метода:
Следующий блок не скомпилирует, таким образом предупредив Вас к ошибке сразу:
public Example(final int j, final int k) {
j = j;
k = k;
}
В Вашем коде конструктора Вы присваиваете переменные себе. 'j' является j, указанным в аргументе в пользу конструктора. Даже если это была переменная класса j определенный выше, то Вы все еще говорите "j = j"..., т.е. j не собирается оценивать по-другому слева и справа.
public Example(int j, int k) {
this.j = j;
this.k = k;
}
То, что Вы испытываете, называют переменным затенением. Взгляните на этот обзор для различных видов переменных в Java.
Вообще говоря: компилятор Java использует ближайшую переменную, которую он может найти для присвоения. В методе это сначала попытается найти локальную переменную и затем увеличить фокус ее поиска к переменным класса и переменным экземпляра.
Одна привычка, которую я лично нахожу хорошими (другим не нравится она) снабжает префиксом членскую переменную m_ и использует верхний регистр для CONSTANT_VARIABLES, которые не изменяют их значение. Код, где переменное затенение используется нарочно, очень (!) трудно отладить и работать с.
Точно так же, как Robert Grant сказал, 'это' - то, как Вы проясняете, что обращаетесь к членской переменной вместо локальной переменной.
Вы присваиваете параметр себе в Вашем примере.
В более общем плане разговор: Если Вы не предварительно ожидаете объем к своей переменной, текущая область принята - который является функцией в Вашем случае. 'this.j' говорит jre использовать переменную j в области объекта - членская переменная объекта.
Для ответа на последующий вопрос об этом с методом внутренний класс, упомянутый 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()
если нет никакой неоднозначности.
Это не вполне отвечает на Ваш вопрос, но если Вы используете Eclipse, Вы могли бы найти установку "Assignment has no effect" полезной. Я уверен, что это будет в других IDE также.
Возможно, вы захотите взять посмотрите на В чем преимущество наличия this / self
указателя обязательного явного?
Хотя использование this
не обязательно в Java, как вы заметили, я уверен, что прольет свет на тему использования this
в Java.
Чтобы избежать этого, используйте IDE (например, Eclipse), и в этом случае она будет генерировать предупреждения.
Кроме того, сделайте ваши поля окончательными, если они абсолютно не могут быть. Для этого есть ряд причин (помимо этой).