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; } }