web-dev-qa-db-ja.com

Lombok.valは実際にどのように機能しますか?

Lombok.val これにより

実際に型を記述する代わりに、ローカル変数宣言の型としてvalを使用します。これを行うと、タイプは初期化式から推測されます。ローカル変数もfinalになります。

だから代わりに

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

あなたは書ける

val example = new ArrayList<String>();

これが実際にどのように機能するかを調査しようとしましたが、膨大な量の情報はないようです。 github page を見ると、valがアノテーションタイプであることがわかります。次に、実際の注釈ではなく、注釈typeが使用されます。

この方法でアノテーションタイプを使用できることすら知らなかったのですが、テストすると、次のコードは確かに有効です。ただし、なぜこのタイプをこのように使用するのかはまだわかりません。

public class Main
{
    public @interface Foo { }

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

これらの使用法が注釈ではなく、注釈タイプである場合、Lombokはこれらの使用法をどのように処理しますか?私の(明らかに間違っている)理解では、構文は次のようになります。

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

(注釈の制約は、上記が有効な構文ではないことを意味します)

14
Michael

Lombokが機能するためには、ソースコードがエラーなしで解析される必要があります。そのため、すでに述べたように、@val foo = new ArrayList<String>();は機能しません。

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

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

実際の置き換えについては、Eclipse/ecjについては このクラス および これ を参照してください。 javacについては、 このクラス を参照してください。

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

34
Roel Spilker