1. 概要

オブジェクトのフィールド値を取得または設定する機能を非表示にしたい場合があります。 ただし、Lombokはデフォルトのゲッター/セッターを自動的に生成します。 このクイックチュートリアルでは、ゲッターとセッターをLombokによる生成から除外する方法を示します。 Project Lombokライブラリの詳細については、 ProjectLombokの概要を参照してください。

続行する前に、IDELombokプラグインをインストールする必要があります。

2. 依存関係

まず、Lombokpom.xmlファイルに追加する必要があります。

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

3. デフォルトの動作

ゲッターとセッターの生成を省略する方法の詳細に入る前に、それらの生成を担当するアノテーションのデフォルトの動作を確認しましょう

3.1. @ Getterおよび@Setterアノテーション

Lombokは、@Getter@Setterの2つのアクセサー注釈を提供します。 すべてのフィールドに注釈を付けることも、クラス全体に注釈を付けることもできます。 生成されるメソッドは、デフォルトでpublicになります。 ただし、アクセスレベルを保護された、パッケージ、またはプライベートに変更できます。 例を見てみましょう:

@Setter
@Getter
public class User {
    private long id;
    private String login;
    private int age;
}

IDEのプラグインからdelombokオプションを使用して、Lombokが生成したコードを確認できます。

public class User {
    private long id;
    private String login;
    private int age;

    public long getId() {
        return this.id;
    }

    public String getLogin() {
        return this.login;
    }

    public int getAge() {
        return this.age;
    }

    public void setId(long id) {
        this.id = id;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

ご覧のとおり、すべてのゲッターとセッターが作成されました。 どのフィールドにもアクセスレベルを明示的に指定しなかったため、すべてのフィールドのゲッターとセッターはパブリックです

3.2. @データアノテーション

@Data は、 @Getter@Setterの両方を含む他のいくつかのアノテーションの機能を組み合わせたものです。したがって、この場合、デフォルトのアクセサーメソッドは[ X179X] public も:

@Data
public class Employee {
    private String name;
    private String workplace;
    private int workLength;
}

4. AccessLevel.NONEを使用したゲッターまたはセッターの省略

特定のフィールドでデフォルトのゲッター/セッター生成を無効にするには、特定のアクセスレベルを使用する必要があります。

@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)

このアクセスレベルを使用すると、クラスの@ Getter、@ Setter、または@Dataアノテーションの動作をオーバーライドできます。 アクセスレベルをオーバーライドするには、フィールドまたはクラスに明示的な@Setterまたは@Getterアノテーションを付けます。

4.1. @Getterおよび@Setterアノテーションのオーバーライド

ageフィールドのゲッターとidフィールドのセッターでAccessLevelNONEに変更してみましょう。

@Getter
@Setter
public class User {
    @Setter(AccessLevel.NONE)
    private  long id;
    
    private String login;
    
    @Getter(AccessLevel.NONE)
    private int age;
}

このコードをdelombokしましょう。

public class User {
    private  long id;

    private String login;

    private int age;

    public long getId() {
        return this.id;
    }

    public String getLogin() {
        return this.login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

ご覧のとおり、 id フィールドにはセッターがなく、ageフィールドにはゲッターがあります。

4.2. @Dataアノテーションをオーバーライドする

@Dataアノテーションを使用して、クラスでAccessLevelをNONEに変更する別の例を見てみましょう。

@Data
public class Employee {

    @Setter(AccessLevel.NONE)
    private String name;

    private String workplace;
    
    @Getter(AccessLevel.NONE)
    private int workLength;
}

workLengthフィールドに明示的な@Getterアノテーションを追加し、nameフィールドに明示的な@Setterアノテーションを追加しました。 両方のアクセサーのAccessLevelNONEに設定されます。 delombokコードを見てみましょう。

public class Employee {

    private String name;

    private String workplace;

    private int workLength;
    
    public String getName() {
        return this.name;
    }

    public String getWorkplace() {
        return this.workplace;
    }

    public void setWorkplace(String workplace) {
        this.workplace = workplace;
    }

    public void setWorkLength(int workLength) {
        this.workLength = workLength;
    }
}

予想どおり、@Getter@Setterの明示的な設定は、@Dataアノテーションによって生成されたゲッターとセッターをオーバーライドします。 name フィールドにはセッターが生成されず、workLengthフィールドにはゲッターは生成されません。

5. 結論

この記事では、オブジェクトの特定のフィールドについて、Lombokによるゲッターとセッターの生成を省略する方法について説明しました。 さらに、 @Getter @Setter 、および@Dataアノテーションの例を見ました。 次に、Lombokが注釈設定用に生成したコードを確認しました。

いつものように、コードはGitHubから入手できます。