6

JLS 15.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.myMethodmethodRelyingOnEvalOrder

//*******************************
//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

4

2 に答える 2