Гарантирован ли порядок оценки Java в этом случае вызова метода и аргументов, переданных в
Я немного почитал о JLS15.7.4 а также15.12.4.2, но это не такне гарантирует, что выиграетне бытьоптимизация компилятора / среды выполнения это было быменять порядок, в котором оцениваются аргументы метода.
Предположим, следующий код:
public static void main (String[] args) {
MyObject obj = new MyObject();
methodRelyingOnEvalOrder(obj, obj.myMethod());
}
public static Object methodRelyingOnEvalOrder(MyObject obj, Object input) {
if (obj.myBoolean())
return null;
else
return input;
}
Гарантируется, что компилятор или среда выполненияне буду сделать ложную оптимизацию, такую как следующее? Эта оптимизация может показаться правильной, но она неправильна, когда порядок оценки имеет значение.
В случае, когда звонятobj.myMethod
изменяет значение, которое будет возвращеноobj.myBoolean
важно, чтобыobj.myMethod
называться первым какmethodRelyingOnEvalOrder
требует, чтобы это изменение произошло первым.
//*******************************
//Unwanted optimization possible:
//*******************************
public static void main (String[] args) {
MyObject obj = new MyObject();
methodRelyingOnEvalOrder(obj);
}
public static Object methodRelyingOnEvalOrder(MyObject obj) {
if (obj.myBoolean())
return null;
else
return obj.myMethod();
}
//*******************************
Если возможно, Пожалуйста, покажите некоторые источники или документацию Java, которая поддерживает ваш ответ.
Замечания: Пожалуйста, не просите переписать код. Это особый случай, когда я ставлю под сомнение гарантию порядка оценки и гарантию оптимизации компилятора / среды выполнения. Исполнениеobj.myMethod
должно произойти вmain
метод.