Возьмем, например, цикл, как это:Может ли компилятор оптимизировать создание ссылок?
public boolean method(){
for (int i = 0; i < 5; i++) {
if (this.object.getSomething().getSomeArray().get(i).getArray().size() > 0)
return false;
}
return true;
}
Каждый get
метод просто возвращает частный атрибут. Более читаемый вариант того же кода будет:
public boolean method(){
MySomeArray mySomeArray = this.object.getSomething().getSomeArray();
for (int i = 0; i < 5; i++) {
MyArray array = mySomeArray.get(i).getArray();
if (array.size() > 0)
return false;
}
return true;
}
Другая версия:
public boolean method(){
MySomeArray mySomeArray = this.object.getSomething().getSomeArray();
MyArray array;
for (int i = 0; i < 5; i++) {
array = mySomeArray.get(i).getArray();
if (array.size() > 0)
return false;
}
return true;
}
Я знаю, что в теории компиляторы могут оптимизировать многие вещи, и в этом случае (на мой взгляд) три версии цикла должны быть оптимизированы точно таким же машинным кодом. Насколько я прав, или будет разница в количестве числа инструкций, выполненных в трех версиях?
FWIW, вторая и третья версии практически полностью эквивалентны, возможно, даже с точки зрения сгенерированной сборки. – BeeOnRope
@BeeOnRope - это не проблема в декларации внутри цикла? Другими словами, должен ли я всегда свободно объявлять переменные внутри цикла? – HAL9000
Да, вы должны чувствовать себя свободно. В месте объявления нет такой вещи, как «создание ссылок». Объявление самих местных жителей бесплатное - только когда вы их назначаете (например, через new() или вызываете какой-либо метод) имеет любую стоимость (даже на уровне байт-кода, даже не учитывая JIT). Таким образом, нет недостатка в объявлении переменной в цикле, и на самом деле считается хорошей практикой объявлять переменную в наименьшей возможной области. – BeeOnRope