2017-03-10 15 views
6

Lombok.valあなたは、実際のタイプを書く代わりに のローカル変数宣言の種類としてLombok.valは実際にどのように機能しますか?

使用valをすることができます。これを行うと、型は初期化式から推論されます。ローカル変数も最終的に作成されます。あなたが、私はこれが実際にどのように機能するかにいくつかの研究を行うことを試みましたが、があるようには思えない

val example = new ArrayList<String>(); 

を書くことができます

ので、代わりの

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

膨大な量の情報。 the github pageを見ると、valが注釈タイプであることがわかります。実際の注釈ではなく、注釈が使用されます。

このように注釈の種類を使用することさえできないことさえありましたが、テストする際に次のコードが実際に有効です。しかし、私はまだあなたがこのようにタイプを使用したいと思う理由はまだ分かりません。

public class Main 
{ 
    public @interface Foo { } 

    public static void main(String... args) 
    {  
     Foo bar; 
     System.out.println("End"); 
    } 
} 
彼らは注釈がない場合は、これらの用途ロンボクプロセスをどのように

が、注釈種類?私の(明らかに間違って)理解するには、次の構文は、より多くのようになります。ロンボクが動作するためには

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

(私は注釈の制約が上記の有効な構文ではありません意味知っています)

答えて

14

を、ソースコードはエラーなしで解析する必要があります。それで、あなたがすでに言及したように、@val foo = new ArrayList<String>();はうまくいかないでしょう。

Lombokは注釈と注釈プロセッサを使用しますが、注釈プロセッサはコンパイラが関与する手段としてのみ使用されます。

ロンボクには@valの登録済みプロセッサがありません。代わりに、すべてのjavaファイルを処理し、AST全体を訪問し、valをローカル変数の初期化式の型に置き換えます。

開示:私はロンボク語の開発者です。

+0

ありがとうございます!素晴らしい図書館に感謝します。あなたは交換を行うギブスの場所に私を向けることができますか?興味ある。 – Michael

+1

Eclipseおよびecjについては、https://github.com/rzwitserloot/lombok/blob/master/src/eclipseAgent/lombok/eclipse/agent/PatchVal.javaおよびhttps://github.com/rzwitserloot/lombok/blobを参照してください。 /master/src/eclipseAgent/lombok/eclipse/agent/PatchValEclipse.java、javacの場合は、https://github.com/rzwitserloot/lombok/blob/master/src/core/lombok/javac/handlers/HandleVal.javaを参照してください。 –

関連する問題