1. 序章

このチュートリアルでは、Lombokの構成パラメーターについて説明します。 さまざまなオプションと、構成を正しく設定する方法について説明します。

2. 構成の概要

Lombok は、Javaアプリケーションのほぼすべての標準的な定型文を排除するのに役立つライブラリです。 多くのプロパティと構成をテストします。 まず、Lombok依存関係を追加します。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
    <scope>provided</scope>
</dependency>

Lombokの構成システムは、プロジェクトのすべてのコンポーネントで同じであることが多い多くの貴重な設定を提供します。 ただし、Lombokの動作を変更またはカスタマイズしたり、使用可能なすべての機能から使用できるものと使用できないものを定義したりすることもできます。 たとえば、実験的な機能が使用されている場合は、警告またはエラーを表示するようにLombokに指示できます。

Lombokの動作の定義またはカスタマイズを開始するには、 lombok.config。というファイルを作成する必要があります。このファイルは、プロジェクト、ソースコード、または任意のパッケージのルートに残すことができます。 作成されると、子ディレクトリ内のすべてのソースファイルは、そのようなファイルで定義された構成を継承します。 複数の構成ファイルを持つことが可能です。 たとえば、ルートディレクトリに一般的なプロパティを使用して構成ファイルを定義し、他のプロパティを定義する特定のパッケージに別のファイルを作成できます。

新しい構成は、指定されたパッケージのすべてのクラスとすべての子パッケージに影響します。 また、同じプロパティの定義が複数ある場合は、クラスまたはメンバーに近い方が優先されます。

3. 基本構成

最初に言及することの1つは、機能のプロパティが多すぎて説明できないことです。 このため、最も一般的なもののみを表示します。 使用可能なオプションを確認するには、 Lombokのページに移動し、jarをダウンロードして、ターミナルで次のコマンドを実行します。

java -jar lombok.jar config -g --verbose

その結果、すべてのプロパティとその可能な値の完全なリストと、その目標を説明する簡単な説明が表示されます。

ここで、典型的なlombok.configファイルを見てみましょう。

config.stopBubbling = true
lombok.anyconstructor.addconstructorproperties = false
lombok.addLombokGeneratedAnnotation = true
lombok.experimental.flagUsage = WARNING

# ... more properties

ファイルで使用されているプロパティは、説明のみを目的としています。 それらについては後で説明します。 しかし、ここでは、Lombokプロパティの形式とその定義を観察できます。

config.stopBubblingプロパティから始めましょう–このオプションは、親ディレクトリで構成ファイルを検索しないように構成システムに指示します。 このプロパティをワークスペースまたはプロジェクトのルートに追加することをお勧めします。 デフォルトでは、その値はfalseです。

4. 主なプロパティ

4.1. グローバル構成キー

グローバル構成キーは、構成システム自体の多くに影響を与える可能性のある構成です。 次に、そのようなキーの例をいくつか見ていきます。

最初に説明するキーは lombok.anyConstructor.addConstructorProperties。 それは追加します @ java.beans.ConstructorProperties 引数を持つすべてのコンストラクターへの注釈。 通常、コンストラクターでリフレクションを使用するフレームワークは、プロパティをマップし、コンストラクター内のパラメーターの正しい順序を知るためにこのアノテーションを必要とします。 Lombokバージョンのコードは次のとおりです。

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Account {
    private double balance;
    private String accountHolder;
}

そして、これが生成されたコードです:

public class Account {
    private double balance;
    private String accountHolder;

    @ConstructorProperties({"balance", "accountHolder"})
    @Generated
    public Account(double balance, String accountHolder) {
        this.balance = balance;
        this.accountHolder = accountHolder;
    }
 
    @Generated
    public Account() {}

    // default generated getter and setters
}

上記のコードスニペットでは、@ConstructorPropertiesアノテーションを含む生成されたクラスを確認できます。

次に、 lombok.addLombokGeneratedAnnotation。 trueの場合、Lombokは生成されたすべてのメソッドに@lombok.Generatedのマークを付けます。 これは、Lombokで生成されたメソッドをパッケージスキャンまたはコードカバレッジツールから削除するときに便利です。

もう1つの役立つキーは lombok.addNullAnnotations。 このプロパティは、javax(JSR305)、Eclipse、JetBrains、NetBeans、Androidなどの多くの組み込みオプションをサポートします。 CUSTOM:com.example.NonNull:example.Nullable のように、自分で定義した注釈を使用することもできます。 Lombokは、意味がある場合はいつでもnullableまたはNotNullアノテーションを追加します。

最後に、 lombok.addSuppressWarnings、があり、 false の場合、Lombokは注釈 @SuppressWarnings( “all”)、の追加を停止します。これは現在のデフォルトの動作です。 。 これは、生成されたコードで静的アナライザーを使用する場合に役立ちます。

4.2. その他の構成キー

最初の機能固有のキーlombok.accessors.chain、である場合、 true の場合、セッターメソッドの動作が変更されます。 void return の代わりに、これらのメソッドはthisを返します。 以下に示すように、呼び出しの連鎖を許可します。

@Test
void should_initialize_account() {
    Account myAccount = new Account()
      .setBalance(2000.00)
      .setAccountHolder("John Snow");

    assertEquals(2000.00, myAccount.getBalance());
    assertEquals("John Snow", myAccount.getAccountHolder());
}

前のものと同様に、 lombok.accessors.fluent は、プロパティ名のみを使用してアクセサーメソッドからプレフィックスsetおよびgetを削除します。 。

lombok.log.fieldName キーは、ユーザーが構成したときに生成されたログフィールドの名前を変更します。 デフォルトでは、lombok.log.fieldNameキーはlogを使用してフィールドに名前を付けますが、この例では、domainLogに変更しました。

#Log name customization
lombok.log.fieldName = domainLog

次に、実際の動作を確認できます。

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Log
public class Account {

    // same as defined previously

   public Account withdraw(double amount) {
        if (this.balance - abs(amount) < 0) {
            domainLog.log(Level.INFO, "Transaction denied for account holder: %s", this.accountHolder);
            throw new IllegalArgumentException(String.format("Not enough balance, you have %.2f", this.balance));
        }

        this.balance -= abs(amount);
        return this;
    }
}

次は lombok。(featureName).flagUsage。 このプロパティのセットには警告 エラー、許可する可能な値として。 それらを使用して、プロジェクトで許可されるLombok機能を制御できます。 たとえば、実験機能が使用されている場合は、単語Experimentalと値warningを使用して、ログにメッセージを出力できます。

/home/dev/repository/git/tutorials/lombok/src/main/java/com/baeldung/lombok/configexamples/TransactionLog.java:9:
 warning: Use of any lombok.experimental feature is flagged according to lombok configuration.
@Accessors(prefix = {"op"})

4.3. 特別な構成キー

一部のキーは、一般的なキー値プロパティではありません。 lombok.copyableAnnotations。 このプロパティは、完全修飾アノテーションタイプのリストを表すため、異なります。 フィールドに追加されると、Lombokはそれらの注釈をフィールドに関連するコンストラクター、ゲッター、およびセッターにコピーします。 この機能の一般的なユースケースは、Springを使用したBean定義であり、アノテーション@Qualifierと@Valueをコンストラクター引数に頻繁にコピーする必要があります。 他のフレームワークもこの機能を活用しています。

リストに注釈を追加するには、ユーザーは次の式を使用する必要があります: lombok.copyableAnnotations + =com.test.MyAnnotation。 ライブラリは、前述のnull許容アノテーションを伝播するメカニズムを使用します。

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Log
public class Account {

    @NonNull
    private Double balance = 0.;
    @NonNull
    private String accountHolder = "";

    // other methods
}

さて、Lombokによって生成されたコード:

public class Account {

    @Generated
    private static final Logger domainLog = Logger.getLogger(Account.class.getName());
    @NonNull
    private Double balance = 0.0D;
    @NonNull
    private String accountHolder = "";

    @ConstructorProperties({"balance", "accountHolder"})
    @Generated
    public Account(@NonNull Double balance, @NonNull String accountHolder) {
        if (balance == null) {
            throw new NullPointerException("balance is marked non-null but is null");
        } else if (accountHolder == null) {
            throw new NullPointerException("accountHolder is marked non-null but is null");
        } else {
            this.balance = balance;
            this.accountHolder = accountHolder;
        }
    }

    @NonNull
    @Generated
    public Double getBalance() {
        return this.balance;
    }

    @NonNull
    @Generated
    public String getAccountHolder() {
        return this.accountHolder;
    }

    // Rest of the class members...

}

そして最後に、 clear lombok。(anyConfigKey)directive。構成キーをデフォルト値に復元します。 誰かが親構成ファイルで指定されたキーの値を変更した場合、それは無視されるようになりました。 ディレクティブclear、の後に、任意のLombok構成キーを使用できます。

clear lombok.addNullAnnotations

4.4. ファイルディレクティブ

これで、Lombokの構成システムがどのように機能するかとその機能のいくつかについての良いアイデアが得られました。 もちろん、これは利用可能なすべての機能の広範なリストではありませんでしたが、ここから、それを使用する方法を明確に理解する必要があります。 最後になりましたが、現在の構成ファイル内の別のファイルで定義されている構成をインポートする方法を見てみましょう。

別のファイル内に構成ファイルをインポートするには、ディレクティブをファイルの先頭に配置する必要があり、パスは相対パスまたは絶対パスのいずれかになります

##     relative or absolute path  
import lombok_feature.config

config.stopBubbling = true
lombok.anyconstructor.addconstructorproperties=false
lombok.addLombokGeneratedAnnotation = true
lombok.addSuppressWarnings = false

説明のために、インポートされたファイルは次のとおりです。

# lombok_feature.config file

lombok.experimental.flagUsage = warning

5. 結論

この記事では、Lombokの構成システム、そのさまざまなプロパティ、およびそれらがその機能にどのように影響するかについて説明しました。 前述のように、利用できるオプションは他にもたくさんありますが、ここでは最も一般的なオプションのみを取り上げました。 ロンボクページで詳細を確認してください。

いつものように、この記事で使用されているすべてのコードサンプルは、GitHubから入手できます。