Warum hat Java API in if-Anweisungen scheinbar merkwürdige Zuweisungen?

9

Ich bin neu in Programmierung und Java. Ich habe festgestellt, dass es in der Java-API Methoden mit seltsamen Zuweisungen in if-Anweisungen gibt.

Hier ist ein Beispiel von der Map-Schnittstelle:

%Vor%

Gibt es irgendeine Art von Vorteil, um die Aufgabe auf diese Weise zu verschachteln? Ist das eine reine Stilwahl? Warum nicht einfach die Zuweisung machen, wenn curValue zuerst deklariert wird?

%Vor%

Ich habe das in vielen der neu hinzugefügten Java 8-Methoden in der Map-Oberfläche und anderswo bemerkt. Diese Form der Verschachtelung der Zuweisung scheint unnötig.

Bearbeiten: ein weiteres Beispiel aus der Map-Oberfläche:

%Vor%     
Ivan 07.02.2018, 00:21
quelle

2 Antworten

2

Es gibt fast keinen Unterschied im generierten Bytecode (Ein Befehlsunterschied): Ссылка

Ich schrieb dies, um die Anweisungen zu generieren und sie hübsch auszudrucken:

%Vor%

Verwendung: new Acid().print();

Ausgabedifferenz ist eine einzelne DUP Anweisung gegen ALOAD Anweisung ..

Für diejenigen, die sagen ... Nun, Ihre Schnittstelle ist nicht die Schnittstelle des Java JDK. Ich habe auch einen Vergleich gemacht: Ссылка .

Ich bin sehr zuversichtlich, dass JIT sie als den exakt gleichen Code sehen wird, unabhängig davon, ob Sie die Variable außerhalb der if-Anweisung oder innerhalb davon initialisieren.

Der obige Code wurde ausgeführt:

%Vor%

Alles in allem ist es persönliche Vorlieben ..

    
Brandon 07.02.2018 01:56
quelle
2

Was das tut, ist eigentlich Kopieren in eine lokale Variable, das erzeugt einen kleineren Byte-Code, und es wird als eine absolute extreme Art der Optimierung gesehen, werden Sie Sehen Sie dies an zahlreichen anderen Stellen im jdk-Code.

Eine andere Sache ist, dass das Lesen einer lokalen Variablen mehrere Male bedeutet, dass eine gemeinsam genutzte Variable nur einmal gelesen wird, wenn dies zum Beispiel ein volatile wäre und Sie es nur einmal lesen würden und damit innerhalb der Methode arbeiten würden.

BEARBEITEN

Der Unterschied zwischen den beiden Herangehensweisen ist ein einzelner Lesevorgang WIE ICH KANN

Angenommen, wir haben diese zwei Methoden:

%Vor%

Der Byte-Code dafür ist fast identisch, außer dass replaceSecond haben wird:

%Vor%

Während die replace -Methode sein wird:

%Vor%

Nach meinem Verständnis zählt dup nicht als ein weiterer Lesevorgang, also denke ich, dass dies eine extreme Optimierung ist?

    
Eugene 07.02.2018 07:57
quelle

Tags und Links