読者です 読者をやめる 読者になる 読者になる

覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。 twitter: @yyoshikaw

Lombok - @Accessors

Java Lombok

Lombokの@Accessors(lombok.experimental.Accessors)アノテーションの利用サンプルです。

クラスに@Accessorsアノテーションを付与してパラメータを指定することで、@Getter/@Setterで生成されるgetter/setterをカスタマイズすることができます。

@Accessorsは所属パッケージが"experimental"になっており、その名の通り実験的なアノテーションです。
そのため、今後Lombokのバージョンが上がった際などに仕様が変更される可能性もあると思われます。


setterをメソッドチェーンにする

通常のsetterは戻り値がvoidになっていますが、@Accessorsアノテーションのchainパラメータにtrueを指定することで、setterの戻り値が自身のインスタンスに変わります。
これによりsetterをメソッドチェーンの形で使用することができます。

■@Accessorsを付与したクラス

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

@Accessors(chain=true)
@Getter
@Setter
public class Person1 {

    private long id;

    private String name;

    private int age;

    private boolean isAdult;
}

■利用側のコード

setterを連続して繋いで書けることが分かります

public class Person1Client {

    public static void main(String[] args) {
        Person1 p1 = new Person1();

        // method chain
        p1.setId(100)
            .setName("Taro")
            .setAge(12)
            .setAdult(true);

        System.out.println("id: " + p1.getId());
        System.out.println("name: " + p1.getName());
        System.out.println("age: " + p1.getAge());
        System.out.println("isAdulet: " + p1.isAdult());
    }
}

■実行結果

id: 100
name: Taro
age: 12
isAdulet: true

■実際に生成されるソースコード

setterが自身のインスタンスをreturnしていることが分かります

public class Person1 {
    private long id;
    private String name;
    private int age;
    private boolean isAdult;

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

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

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

    public boolean isAdult() {
        return this.isAdult;
    }

    public Person1 setId(final long id) {
        this.id = id;
        return this;
    }

    public Person1 setName(final String name) {
        this.name = name;
        return this;
    }

    public Person1 setAge(final int age) {
        this.age = age;
        return this;
    }

    public Person1 setAdult(final boolean isAdult) {
        this.isAdult = isAdult;
        return this;
    }
}


メンバ名と同一の名前でgetter/setterを定義する

通常であればgetter/setterは、"get" + メンバ名, "set" + メンバ名 という名前のメソッドで定義しますが、
@Accessorsアノテーションのfluentパラメータにtrueを指定することで、getter/setterがメンバ名と同一の名称でメソッドが生成されます。
また、chain=trueを指定した時と同様に、setterはメソッドチェーンの形で使用することができます。

■@Accessorsを付与したクラス

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

@Accessors(fluent=true)
@Getter
@Setter
public class Person2 {

    private long id;

    private String name;

    private int age;

    private boolean isAdult;
}

■利用側のコード

メンバ名と同一の名前のメソッドでのアクセスになっていることが分かります

public class Person2Client {

    public static void main(String[] args) {
        Person2 p1 = new Person2();

        // method chain
        p1.id(100)
            .name("Taro")
            .age(12)
            .isAdult(true);

        System.out.println("id: " + p1.id());
        System.out.println("name: " + p1.name());
        System.out.println("age: " + p1.age());
        System.out.println("isAdulet: " + p1.isAdult());
    }
}

■実行結果

id: 100
name: Taro
age: 12
isAdulet: true

■実際に生成されるソースコード

メンバ名と同一の名前のメソッドが生成されていることが分かります。また、setterは自身のインスタンスをreturnしていることが分かります

public class Person2 {
    private long id;
    private String name;
    private int age;
    private boolean isAdult;

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

    public String name() {
        return this.name;
    }

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

    public boolean isAdult() {
        return this.isAdult;
    }

    public Person2 id(final long id) {
        this.id = id;
        return this;
    }

    public Person2 name(final String name) {
        this.name = name;
        return this;
    }

    public Person2 age(final int age) {
        this.age = age;
        return this;
    }

    public Person2 isAdult(final boolean isAdult) {
        this.isAdult = isAdult;
        return this;
    }
}


メンバ名のprefix部分を除いた名称を用いてgetter/setterを定義する

通常であればgetter/setterは、"get" + メンバ名, "set" + メンバ名 という名前のメソッドで定義しますが、
@Accessorsアノテーションのprefixパラメータにprefixの文字列を指定することで、そのprefixを除いた名前に対応するgetter/setterのメソッドを生成することができます。

■@Accessorsを付与したクラス

fNameというメンバに@Accessors(prefix="f")を付与しています

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

@Getter
@Setter
public class Person3 {

    private long id;

    @Accessors(prefix="f")
    private String fName;

    private int age;

    private boolean isAdult;
}

■実際に生成されるソースコード

メンバのfNameに対応するgetter/setterの名前が getFName, setFNameではなくgetName, setNameになっていることが分かります。

public class Person3 {
    private long id;
    private String fName;
    private int age;
    private boolean isAdult;

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

    public String getName() {
        return this.fName;
    }

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

    public boolean isAdult() {
        return this.isAdult;
    }

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

    public void setName(final String fName) {
        this.fName = fName;
    }

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

    public void setAdult(final boolean isAdult) {
        this.isAdult = isAdult;
    }
}



関連エントリ