コンストラクタ
メンバ変数をすべて初期化するためのコンストラクタは、通常は下記のようになります。メンバ変数分の引数が必要になっており、これもボイラープレートコードです。
public Member(final String id, final String name) {
this.id = id;
this.name = name;
}
Lombokでは、コンストラクタ用のアノテーションが3つ用意されています。
@AllArgsConstructor
@AllArgsConstructorアノテーションは、前述のコードのように、すべてのメンバ変数に値を設定するための引数を持つコンストラクタを定義します。
@AllArgsConstructor
public class Member {
private String id;
private String name;
}
@RequiredArgsConstructor
変更されることのないメンバ変数に対しては、finalを付与します。final宣言されたメンバ変数はコンストラクタ終了時までに値を設定する必要があるため、下記のようにコンストラクタ引数に初期化用の値を受け取りfinal宣言されたメンバ変数を初期化します。
public class Member {
private final String id;
private String name;
public Member(final String id) {
this.id = id;
}
}
@RequiredArgsConstructorアノテーションを使用すると、final宣言されたメンバ変数のみ初期化を行うコンストラクタの生成ができます。final宣言されていないメンバ変数については、コンストラクタでは初期化されません。
@RequiredArgsConstructor
public class Member {
private final String id;
private String name;
}
@NoArgsConstructor
使い道はなさそうですが、デフォルトコンストラクタ用のアノテーションも用意されています。
@NoArgsConstructor
public class Member {
private String id;
private String name;
}
| 属性 | 説明 |
|---|---|
| access | コンストラクタのアクセス識別子を設定する。省略時はpublic。 |
| staticName |
通常のコンストラクタではなく、 指定された名前のstaticメソッドをインスタンス生成メソッドとして用意する。 |
オブジェクトメソッド
Objectクラス由来のequals(),hashCode(),toString()といった、JavaBeanを作成する際によく実装されるメソッドについても、アノテーションが用意されています。
@EqualsAndHashCode
オブジェクト等価性を表現するメソッドには、equals()メソッドおよび、hashCode()メソッドがあります。Objectクラスに定義されたequals()メソッドは同じインスタンスの場合に等価と判断しtrueを返します。また、hashCode()メソッドが返却するハッシュコードは同じインスタンスの場合に同じハッシュコードを返します(ただし、異なるインスタンスの場合、異なるハッシュコードになるとは限りません)。
より高いレベルの等価性を表現するため、両メソッドをオーバーライドすることはよくあります。下記の例では位置クラスが保持する座標xと座標yが同じ値であるインスタンスの場合、等価であると判断するように実装しています。
public class Point {
private int x;
private int y;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Point other = (Point) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
}
両メソッドに対応するのが、@EqualsAndHashCodeアノテーションです。下記のコードは上記のコードと同様にメンバ属性xとメンバ属性yが同じ値を持つインスタンスの場合、hashCodeメソッドは同じハッシュコードを返し、equalsメソッドはtrueを返します。
@EqualsAndHashCode
public class Point {
private int x;
private int y;
}
| 属性 | 説明 |
|---|---|
| callSuper |
基底クラスのequalsメソッド、hashCodeメソッドを呼び出し、 等価性の判断に加えるのかを指定する。省略時はfalse。 |
| doNotUseGetters |
getterメソッドを利用せずに属性を取得するかを指定する。省略時はfalse。 getterメソッドが存在しない場合には、この属性の指定に限らずメンバ変数を直接参照する。 |
| exclude |
等価性の判断に含めないメンバ変数を指定する。 この属性を利用した場合、指定されていないメンバ変数だけで等価性を判断する。 |
| of | 等価性の判断に含めるメンバ変数を明示的に指定する。 |
