1. Syntaktischer Zucker

Programmierer lieben es, wenn komplexer Code oder komplexe Logik in ein paar Zeilen geschrieben werden kann, wodurch der Code kompakt und lesbar wird. Und dabei helfen manchmal die Entwickler von Programmiersprachen.

Eine raffinierte Sprachfunktion, mit der Sie eine Abkürzung nehmen (weniger Code schreiben) können, heißt syntaktischer Zucker . Aber um ehrlich zu sein, gibt es in Java sehr wenig davon.

Die Entwickler von Java haben alles getan, um jegliche Redundanz in Java zu beseitigen. Wenn Sie mit C++ etwas auf 20 Arten tun können, können Sie es mit Java nur auf eine Art tun.

Aber weder Java-Programmierern noch Java-Entwicklern gefiel der Mangel an Freiheit. Und manchmal macht Zucker gewöhnlichen Menschen wie Ihnen und mir das Leben leichter.

Übrigens sind Sie bereits auf syntaktischen Zucker gestoßen: Autoboxing und Unboxing . Lass uns vergleichen:

Langer Code Kompakter Code
Integer a = new Integer(5);
int b = a.intValue();
Integer a = 5;
int b = a;
int b = 5;
Integer c = new Integer(b);
int b = 5;
Integer c = b;
Integer a = new Integer(1);
int b = 1;
if (a.intValue() == b)
{
   ...
}
Integer a = 1;
int b = 1;
if (a == b)
{
   ...
}

Anstelle des langen Codes wie links können Sie auch den kompakteren Code rechts schreiben. Und der intelligente Java-Compiler generiert die ausführliche Version des Codes basierend auf der kurzen Version des Codes. Genau das ist syntaktischer Zucker.


2. Rückschluss auf den Typ einer Variablen: das varSchlüsselwort

In Java 11 wurde der Compiler noch intelligenter und kann nun den Typ einer deklarierten Variablen anhand des Typs des ihr zugewiesenen Werts bestimmen . Im Code sieht es so aus:

var name = value;

Dabei nameist der Name einer neuen Variablen, Wert ihr Anfangswert und varein Schlüsselwort, das zum Deklarieren der Variablen verwendet wird. Der Typ der Namensvariablen ist derselbe wie der Typ des ihr zugewiesenen Werts.

Beispiele:

Wie wir den Code sehen Was der Compiler sieht
var i = 1;
int i = 1;
var s = "Hello";
String s = "Hello";
var console = new Scanner(System.in);
Scanner console = new Scanner(System.in);
var list = new ArrayList<String>();
ArrayList<String> list = new ArrayList<String>();
var data = new int[]{1, 2, 3};
int[] data = new int[]{1, 2, 3};

Der Compiler selbst bestimmt oder leitet den Typ der Variablen basierend auf dem ihr zugewiesenen Wert ab.

Unter den Programmierern wurde heftig darüber debattiert, ob der Sprache eine solche Funktion hinzugefügt werden sollte. Viele befürchteten, dass dies varmissbraucht würde und dadurch die Lesbarkeit des Codes beeinträchtigt würde.

Darin steckt ein Körnchen Wahrheit, daher ist es am besten, es vardort zu verwenden, wo es die Lesbarkeit des Codes verbessert. Zum Beispiel diese in zwei Fällen:

Fall 1: Betrachtet man den der Variablen zugewiesenen Wert, ist der Typ der Variablen sofort klar

Code Erläuterung
var stream = url.getInputStream();
Die Variable ist eineInputStream
var name = person.getFullName();
Die Variable ist aString

In diesen Fällen sollten Sie nicht verwenden var. Nun, was ist der Typ der Variablen?

Code Erläuterung
var result = task.execute();
Es ist schwierig, den Typ der Variablen zu bestimmen
var status = person.getStatus();
Es ist schwierig, den Typ der Variablen zu bestimmen

Fall 2: Der Typ der Variablen ist für das Verständnis des Codes nicht wichtig

Code erfordert häufig keine Methodenaufrufe für eine Variable, z. B. wenn eine Variable lediglich zum vorübergehenden Speichern von etwas verwendet wird. In diesem Fall varbeeinträchtigt die Verwendung definitiv nicht die Lesbarkeit des Codes:

Langer Code Kompakter Code
var data = stream.getMetaData();
storage.save(data)
Wir haben Metadaten aus dem streamStream abgerufen und im storageRepository gespeichert. Der dataspezifische Typ der Variablen ist nicht wichtig.

Die goldene Mitte

Jetzt werde ich drei Möglichkeiten nennen, denselben Code zu schreiben. Die Verwendung varwäre die beste Option.

Code Notiz
dest.writeHeaderInfo(src.getFileMetaInfo());
Zu kompakt
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Genau richtig
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Zu detailliert

Beim Übergang von der Version mit 1 Zeile zur Version mit 2 Zeilen haben wir den Code durch die Verwendung eines Variablennamens ( ) etwas lesbarer gemacht headerInfo. Jetzt ist klar, dass die Methode nicht nur Metainformationen, sondern auch Header-Informationen zurückgibt.

Die dritte Version ist zu ausführlich. Die Tatsache, dass headerInfoes sich um eine handelt, geht aus der Methode FileMetaInfobereits ziemlich klar hervor . getFileMetaInfo()Der Zweck der Metainformationen ist viel interessanter.



3. Weglassen des Typs mit dem Diamantoperator:<>

Schon vor dem varErscheinen des Operators gab es Versuche, dem Compiler beizubringen, wie er Sammlungstypen ableitet. Sie werden zustimmen, dass diese Notation etwas überflüssig erscheint:

ArrayList<String> list = new ArrayList<String>();

Ab der siebten Version von Java konnten Sie beim Schreiben eines Sammlungstyps den Typ der Sammlungselemente weglassen, wenn er bei der Deklaration einer Variablen angegeben wurde. Mit anderen Worten, der obige Code kann in leicht abgekürzter Form geschrieben werden:

ArrayList<String> list = new ArrayList<>();

Wie Sie sehen, müssen Sie String nicht mehr ein zweites Mal schreiben. Nicht so cool wie mit dem var-Operator, aber es schien damals ein Fortschritt zu sein.

Die leeren spitzen Klammern im Sammlungstyp wurden als Rautenoperator bezeichnet , da die beiden spitzen Klammern vage einer Raute ähneln.

Es ist unerwünscht, das varSchlüsselwort und den Diamantoperator gleichzeitig zu verwenden :

var list = new ArrayList<>();

Es gibt überhaupt keine Informationen über den Typ der in der Sammlung gespeicherten Elemente und der Sammlungstyp ist ArrayList < Object >.



4. Doppelte geschweifte Klammern

Erinnern Sie sich an die schnelle Array-Initialisierung?

Wir haben gerade Werte in geschweiften Klammern aufgeführt, etwa so:

Beispiele
int[] data = new int[] {1, 2, 3, 4, 5, 6, 7};
int[] data = {1, 2, 3, 4, 5, 6, 7};

Den Entwicklern von Java gefiel die Idee, geschweifte Klammern zu verwenden, um das Schreiben von Elementen eines Arrays zu vereinfachen. Aber wie sieht es mit Sammlungen aus?

Auch für Sammlungen verfügten die Java-Entwickler über genügend kreatives Denken, sodass sie einen Trick mit doppelten geschweiften Klammern anwenden konnten.

Mit Zucker Ohne Zucker
var list = new ArrayList<String>()
{{
   add("Hello");
   add("How's");
   add("Life?");
}};
var list = new ArrayList<String>();

list.add("Hello");
list.add("How's");
list.add("Life?");

Wenn der Compiler auf Code wie im Beispiel links stößt, konvertiert er ihn in den Code rechts.

Der Code wird nicht viel kompakter. Die Einsparungen sind hier eher unbedeutend: Sie müssen nicht listjedes Mal schreiben. Dies kann hilfreich sein, wenn der Variablenname sehr lang ist.

Aber wenn Sie in einem Projekt auf Code wie diesen stoßen, wundern Sie sich nicht 🙂