Heim  >  Artikel  >  Java  >  Eine kurze Analyse der Typanmerkungen in Java8

Eine kurze Analyse der Typanmerkungen in Java8

高洛峰
高洛峰Original
2017-01-23 15:19:101449Durchsuche

Anmerkung Wie wir alle wissen, wurde diese Funktion seit Java5 hinzugefügt und hat sich mittlerweile überall verbreitet. Sie wird häufig in vielen Frameworks verwendet, um die Konfiguration von Programmen zu vereinfachen. Was genau sind also die umstrittenen Typanmerkungen? Komplex oder bequem?

1. Was sind Typanmerkungen?

Vor Java 8 können Annotationen nur dort verwendet werden, wo sie deklariert sind, z. B. bei Klassen, Methoden und Eigenschaften beliebige Orte, wie zum Beispiel:

Klasseninstanz erstellen

new @Interned MyObject();

Typzuordnung

myString = (@NonNull String) str;

Implementiert die Anweisung

class UnmodifiableList<T> implements @Readonly List<@Readonly T> { ... }

Ausnahmeanweisung auslösen

void monitorTemperature() throws @Critical TemperatureException { ... }

Es ist zu beachten, dass Typanmerkungen nur Syntax und keine Semantik sind und keinen Einfluss auf die Kompilierungszeit, Ladezeit und Laufzeit von Java haben. Mit anderen Worten, der Typ ist nicht enthalten, wenn er in a kompiliert wird Klassendatei.

2. Die Rolle von Typanmerkungen

Sehen Sie sich zunächst den folgenden Code an:

Collections.emptyList().add("One");
int i=Integer.parseInt("hello");
System.console().readLine();

Der obige Code wurde erfolgreich kompiliert, aber beim Ausführen wird UnsupportedOperationException gemeldet ; NumberFormatException ; NullPointerException, das sind Laufzeitfehler;

Typanmerkungen werden zur Unterstützung einer starken Typprüfung in Java-Programmen verwendet. Mit dem Plug-in-Check-Framework können Laufzeitfehler während der Kompilierung erkannt werden, um die Codequalität zu verbessern. Dies ist die Rolle von Typanmerkungen.

3. Check Framework

Check Framework ist ein Tool eines Drittanbieters und in Kombination mit Javas Typanmerkungen beträgt der Effekt 1+1>2. Es kann in den Javac-Compiler eingebettet, mit Ant und Maven oder als Eclipse-Plug-In verwendet werden. Die Adresse lautet http://types.cs.washington.edu/checker-framework/.
Das Prüfframework kann herausfinden, wo Typanmerkungen angezeigt werden, und sie überprüfen. Ein einfaches Beispiel:

import checkers.nullness.quals.*;
public class GetStarted {
    void sample() {
        @NonNull Object ref = new Object();
    }
}

Verwenden Sie Javac, um die obige Klasse zu kompilieren.

javac -processor checkers.nullness.NullnessChecker GetStarted.java

Die Kompilierung ist erfolgreich Wenn Sie Folgendes ändern:

@NonNull Object ref = null;

Wenn Sie keine Typanmerkungen zum Erkennen von Fehlern verwenden möchten, benötigen Sie keinen Prozessor, der direkt in javac GetStarted.java kompiliert und übergeben werden kann Java 8 mit Type Annotation Support-Version. Ja, aber nicht die Java 5-, 6- oder 7-Versionen, da der Javac-Compiler nicht weiß, was @NonNull ist, aber das Check-Framework eine abwärtskompatible Lösung hat, nämlich die Annotation des Typs Annotation ungleich Null mit /**/
, zum Beispiel wird das obige Beispiel wie folgt geändert:

import checkers.nullness.quals.*;
public class GetStarted {
    void sample() {
        /*@NonNull*/ Object ref = null;
    }
}

Auf diese Weise ignoriert der Javac-Compiler den Kommentarblock, aber der Javac-Compiler prüft ihn Das Framework kann auch Nicht-Null-Fehler erkennen.
Durch Typanmerkungen + Check-Framework können wir sehen, dass jetzt Laufzeitfehler während der Kompilierung gefunden werden können.

4. Über JSR 308

JSR 308 möchte zwei Probleme lösen, die in Java 1.5-Annotationen auftreten:

1. Syntaktische Einschränkungen bei Anmerkungen: Nur Möglichkeit, Anmerkungen zu schreiben deklariert
2. Semantische Einschränkungen des Typsystems: Das Typsystem kann nicht alle Fehler verhindern
JSR 308 löst die beiden oben genannten Probleme durch die folgenden Methoden:

1. Erweitern Sie die Syntax der Java-Sprache um zu ermöglichen, dass Anmerkungen an mehreren Positionen angezeigt werden. Beinhaltet: Methodenempfänger (Anmerkung: public int size() @Readonly { ... }), generische Parameter, Arrays, Typkonvertierungen, Typtests, Objekterstellung, Typparameterbindung, Klassenvererbung und Throw-Klausel. Tatsächlich handelt es sich um Typannotationen, die jetzt eine Funktion von Java 8

2 sind. Durch die Einführung steckbarer Typsysteme kann ein leistungsfähigerer Annotationsprozessor erstellt werden. Der Typprüfer analysiert den Quellcode mit Typqualifizierungsanmerkungen und generiert Warnmeldungen, wenn Fehler wie Nichtübereinstimmungen gefunden werden. Tatsächlich ist es das Prüfframework
Für JSR308 protestieren einige Leute, weil sie denken, es sei komplizierter und statischer. Beispielsweise wird

@NotEmpty List<@NonNull String> strings = new ArrayList<@NonNull String>()>

durch eine dynamische Sprache ersetzt, um

var strings = ["one", "two"];

Einige Leute sind sich einig, dass Code letztendlich das „grundlegendste“ Dokument ist. Im Code enthaltene Anmerkungen zeigen deutlich die Absicht der Person, die den Code geschrieben hat. Bei nicht rechtzeitiger Aktualisierung oder bei Auslassungen besteht die Gefahr, dass genau die beabsichtigten Informationen in den Anmerkungen in anderen Dokumenten verloren gehen. Darüber hinaus kann die Übertragung von Laufzeitfehlern in die Kompilierungsphase nicht nur den Entwicklungsprozess beschleunigen, sondern auch Zeit bei der Fehlerprüfung während des Tests sparen.

5. Zusammenfassung

Nicht jeder mag diese Funktion, insbesondere heute, wo dynamische Sprachen beliebter sind, zwingt Java 8 nicht jeden dazu, diese Funktion zu nutzen Mit dieser Funktion können Personen oder Unternehmen mit höheren Anforderungen an die Codequalität JSR 308 verwenden. Schließlich ist Code das „grundlegendste“ Dokument, dem ich zustimme. Obwohl der Code zunimmt, kann er Ihren Code dadurch ausdrucksvoller machen. Jeder hat seine eigene Meinung darüber, was er von dieser Funktion hält. .

Weitere Artikel zur kurzen Analyse von Typanmerkungen in Java8 finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn