Гарантирован ли порядок оценки 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 метод.

Ответы на вопрос(2)

Ваш ответ на вопрос