1. 概要

ドメインオブジェクトでgetおよびsetメソッドを使用するのはかなり一般的ですが、より表現力豊かな方法は他にもあります。

このチュートリアルでは、 Project Lombok@Accessorsアノテーションと、流暢、連鎖、およびカスタムアクセサーのサポートについて学習します。

ただし、続行する前に、IDEにLombokをインストールする必要があります

2. 標準アクセサ

@Accessors アノテーションを見る前に、Lombokがデフォルトで@Getterおよび@Setterアノテーションをどのように処理するかを確認しましょう。

まず、クラスを作成しましょう。

@Getter
@Setter
public class StandardAccount {
    private String name;
    private BigDecimal balance;
}

それでは、テストケースを作成しましょう。 テストでは、Lombokが典型的なゲッターメソッドとセッターメソッドを追加したことがわかります。

@Test
public void givenStandardAccount_thenUseStandardAccessors() {
    StandardAccount account = new StandardAccount();
    account.setName("Basic Accessors");
    account.setBalance(BigDecimal.TEN);

    assertEquals("Basic Accessors", account.getName());
    assertEquals(BigDecimal.TEN, account.getBalance()); 
}

@Accessor のオプションを見ると、このテストケースがどのように変化するかがわかります。

3. 流暢なアクセサー

流暢なオプションから始めましょう:

@Accessors(fluent = true)

流暢なオプションは、getまたはsetプレフィックスを持たないアクセサーを提供します。

チェーンオプションについては後で説明しますが、デフォルトで有効になっているため、ここでは明示的に無効にしましょう。

@Accessors(fluent = true, chain = false)
@Getter
@Setter
public class FluentAccount {
    private String name;
    private BigDecimal balance;
}

現在、テストは同じように動作しますが、状態にアクセスして変更する方法を変更しました。

@Test
public void givenFluentAccount_thenUseFluentAccessors() {
    FluentAccount account = new FluentAccount();
    account.name("Fluent Account");
    account.balance(BigDecimal.TEN);

    assertEquals("Fluent Account", account.name()); 
    assertEquals(BigDecimal.TEN, account.balance());
}

getおよびsetプレフィックスがどのように消えたかに注意してください。

4. チェーンアクセサ

次に、chainオプションを見てみましょう。

@Accessors(chain = true)

チェーンオプションは、戻るセッターを提供しますこれ。 繰り返しますが、デフォルトでは真実 、ただし、わかりやすくするために明示的に設定します。

これは、複数のset操作を1つのステートメントにまとめることができることを意味します。

fluent アクセサーに基づいて構築し、chainオプションをtrueに変更しましょう。

@Accessors(fluent = true, chain = true)
@Getter 
@Setter 
public class ChainedFluentAccount { 
    private String name; 
    private BigDecimal balance;
}

chain を省略し、次のように指定した場合も同じ効果が得られます。

@Accessors(fluent = true)

そして、これがテストケースにどのように影響するかを見てみましょう。

@Test
public void givenChainedFluentAccount_thenUseChainedFluentAccessors() {
    ChainedFluentAccount account = new ChainedFluentAccount()
      .name("Fluent Account")
      .balance(BigDecimal.TEN);

    assertEquals("Fluent Account", account.name()); 
    assertEquals(BigDecimal.TEN, account.balance());
}

新しいステートメントが長くなり、セッターがチェーンされ、ボイラープレートが削除されていることに注目してください。

もちろん、これはLombokの@Builderchain ed fluentアクセサーを利用する方法です。

5. プレフィックスアクセサー

そして最後に、フィールドには、ゲッターやセッターを介して公開したい命名規則とは異なる命名規則がある場合があります。

フィールドにハンガリー語表記を使用する次のクラスについて考えてみましょう。

public class PrefixedAccount { 
    private String sName; 
    private BigDecimal bdBalance; 
}

これを@Getter@Setterで公開すると、getSNameのようなメソッドが得られます。

prefix オプションを使用すると、無視するプレフィックスをLombokに指示できます。

@Accessors(prefix = {"s", "bd"})
@Getter
@Setter
public class PrefixedAccount {
    private String sName;
    private BigDecimal bdBalance;
}

それでは、それがテストケースにどのように影響するかを見てみましょう。

@Test
public void givenPrefixedAccount_thenRemovePrefixFromAccessors() {
    PrefixedAccount account = new PrefixedAccount();
    account.setName("Prefixed Fields");
    account.setBalance(BigDecimal.TEN);

    assertEquals("Prefixed Fields", account.getName()); 
    assertEquals(BigDecimal.TEN, account.getBalance());
}

sName フィールドのアクセサー( setName、 getName )が、先頭のsbdBalance[のアクセサーを省略していることに注目してください。 X154X]先頭のbdを省略します。

ただし、Lombok は、プレフィックスの後に小文字以外のものが続く場合にのみプレフィックスを適用します。

これにより、 state、など、ハンガリー語表記を使用していないが、プレフィックスの1つである s で始まるフィールドがある場合、最終的には次のようになりません。 getTate()!

最後に、表記にアンダースコアを使用したいが、それに続いて小文字を使用したいとします。

プレフィックスs_:が付いたフィールドs_notesを追加しましょう

@Accessors(prefix = "s_")
private String s_notes;

小文字のルールに従うと、 getS_Notes()のようなメソッドが得られるため、 Lombokは、プレフィックス自体が文字以外のもので終わる場合にもプレフィックスを適用します

6. 構成プロパティ

lombok.config ファイルに構成プロパティを追加することで、プロジェクト全体またはディレクトリ全体のデフォルトを設定のお気に入りの組み合わせに設定できます。

lombok.accessors.chain=true
lombok.accessors.fluent=true

詳細については、Lombok機能構成ガイドを参照してください。

7. 結論

この記事では、Lombokの @Accessors アノテーションのfluent、chain、 prefix オプションをさまざまな組み合わせで使用して、生成されたコードにどのように影響するかを確認しました。

詳細については、 Lombok AccessorsJavaDocおよびExperimentalFeatureGuideを参照してください。

いつものように、この記事のソースはGitHubから入手できます。