2017-03-10 9 views
6

Lombok.val können SieWie funktioniert Lombok.val tatsächlich?

Verwendung val als Typ einer lokalen Variablen Deklaration statt tatsächlich von die Art zu schreiben. Wenn Sie dies tun, wird der Typ vom Initialisiererausdruck abgeleitet. Die lokale Variable wird ebenfalls als endgültig festgelegt.

Also statt

final ArrayList<String> example = new ArrayList<String>(); 

Sie können

val example = new ArrayList<String>(); 

Ich habe schreiben versucht, einige der Forschung in zu tun, wie dies tatsächlich funktioniert, aber es scheint nicht zu sein eine riesige Menge an Informationen. Betrachtet man the github page, kann ich sehen, dass val ein Anmerkungstyp ist. Die Annotation Typ wird dann anstelle einer tatsächlichen Annotation verwendet.

Mir war nicht einmal bewusst, dass Sie sogar Annotationstypen auf diese Weise verwenden könnten, aber beim Testen ist der folgende Code tatsächlich gültig. Ich bin mir jedoch immer noch nicht sicher, warum Sie den Typ auf diese Weise verwenden möchten.

public class Main 
{ 
    public @interface Foo { } 

    public static void main(String... args) 
    {  
     Foo bar; 
     System.out.println("End"); 
    } 
} 

Wie funktioniert Lombok Prozess diese Verwendungen, wenn sie nicht Anmerkungen, aber Anmerkung Typen? Zu meinem (offensichtlich falsch) Verständnis, sollte die Syntax eher wie:

@Val foo = new ArrayList<String>(); 

(ich bin mir bewusst, Einschränkungen von Annotationen des oben bedeuten, ist nicht gültig Syntax)

Antwort

14

Damit Lombok zu arbeiten, die Quellcode muss ohne Fehler analysiert werden. Deshalb, wie Sie bereits erwähnt haben, @val foo = new ArrayList<String>(); würde nicht funktionieren.

Obwohl Lombok Annotationen und einen Annotationsprozessor verwendet, wird der Annotationsprozessor nur als Mittel zur Einbindung des Compilers verwendet.

Lombok hat keinen registrierten Prozessor für @val. Stattdessen verarbeitet es alle Java-Dateien, besucht den gesamten AST und ersetzt val durch den Typ des Initialisierungsausdrucks der lokalen Variablen.

Offenlegung: Ich bin ein Lombok Entwickler.

+0

Danke! Und danke für eine tolle Bibliothek. Kannst du mich auf den Platz in GitHub hinweisen, der den Ersatz macht? Ich bin interessiert. – Michael

+1

Für Eclipse und ecj, siehe https://github.com/rzwitserloot/lombok/blob/master/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java und https://github.com/rzwitserloot/lombok/blob /master/src/eclipseAgent/lombok/eclipse/agent/PatchValEclipse.java, für javac, siehe https://github.com/rzwitserloot/lombok/blob/master/src/core/lombok/javac/handlers/HandleVal.java –

Verwandte Themen