gebenen Argumente Ich habe einige auf JLS Lesung bis 15.7.4 und 15.12.4.2, aber es garantiert nicht, dass es nicht sein Compiler/Laufzeitoptimierung das wäre ändern Sie die Reihenfolge, in der Methodenargumente ausgewertet werden.Ist Java Auswerteauftrag in diesem Fall der Methodenaufruf garantiert und in
Angenommen, den folgenden Code:
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;
}
ist sichergestellt, dass der Compiler oder Laufzeit eine falsche Optimierung nicht tun wie die folgenden? Diese Optimierung mag korrekt aussehen, aber sie ist falsch, wenn die Reihenfolge der Auswertung wichtig ist.
In dem Fall, wo obj.myMethod
Aufruf den Wert ändert, der von obj.myBoolean
zurückgegeben wird, ist es entscheidend, dass obj.myMethod
zunächst als methodRelyingOnEvalOrder
erfordern diese Veränderung zunächst geschehen aufgerufen werden.
//*******************************
//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();
}
//*******************************
Wenn möglich, Sie einige Quellen oder Java-Dokumentation zeigen, dass Ihre Antwort unterstützt.
Hinweis: Bitte nicht bitten, den Code neu zu schreiben. Dies ist ein spezieller Fall, in dem ich die Evaluierungsauftragsgarantie und die Compiler/Laufzeitoptimierungsgarantie in Frage stelle. Die Ausführung von obj.myMethod
muss in der main
Methode geschehen.
Sie können sicher sein, dass 'javac' fast überhaupt keine Optimierungen durchführt, alles wird vom JIT erledigt. Während es den Methodenaufruf möglicherweise neu anordnet oder sogar eliminiert, sollte das Endeverhalten gleich sein. –