SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Java特有の冗長なコードを簡潔に記述する「Lombok」

  • X ポスト
  • このエントリーをはてなブックマークに追加

コンストラクタ

 メンバ変数をすべて初期化するためのコンストラクタは、通常は下記のようになります。メンバ変数分の引数が必要になっており、これもボイラープレートコードです。

メンバ変数すべてを初期化するコンストラクタ Lombok未使用版
public Member(final String id, final String name) {
    this.id = id;
    this.name = name;
}

 Lombokでは、コンストラクタ用のアノテーションが3つ用意されています。

@AllArgsConstructor

 @AllArgsConstructorアノテーションは、前述のコードのように、すべてのメンバ変数に値を設定するための引数を持つコンストラクタを定義します。

メンバ変数すべてを初期化するコンストラクタ Lombok使用版
@AllArgsConstructor
public class Member {
    private String id;
    private String name;
}

@RequiredArgsConstructor

 変更されることのないメンバ変数に対しては、finalを付与します。final宣言されたメンバ変数はコンストラクタ終了時までに値を設定する必要があるため、下記のようにコンストラクタ引数に初期化用の値を受け取りfinal宣言されたメンバ変数を初期化します。

final宣言されたメンバ変数を初期化するコンストラクタ Lombok未使用版
public class Member {
    private final String id;
    private String name;
    public Member(final String id) {    
        this.id = id;
    }
}

 @RequiredArgsConstructorアノテーションを使用すると、final宣言されたメンバ変数のみ初期化を行うコンストラクタの生成ができます。final宣言されていないメンバ変数については、コンストラクタでは初期化されません。

final宣言されたメンバ変数を初期化するコンストラクタ Lombok使用版
@RequiredArgsConstructor
public class Member {
    private final String id;
    private String name;
}

@NoArgsConstructor

 使い道はなさそうですが、デフォルトコンストラクタ用のアノテーションも用意されています。

引数なしコンストラクタ Lombok使用版
@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が同じ値であるインスタンスの場合、等価であると判断するように実装しています。

hashCodeメソッドとequalsメソッドの実装 Lombok未使用版
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を返します。

hashCodeメソッドとequalsメソッドの実装 Lombok使用版
@EqualsAndHashCode
public class Point {
    private int x;
    private int y;
}
@EqualsAndHashCodeアノテーション属性の説明
属性 説明
callSuper 基底クラスのequalsメソッド、hashCodeメソッドを呼び出し、
等価性の判断に加えるのかを指定する。省略時はfalse。
doNotUseGetters getterメソッドを利用せずに属性を取得するかを指定する。省略時はfalse。
getterメソッドが存在しない場合には、この属性の指定に限らずメンバ変数を直接参照する。
exclude 等価性の判断に含めないメンバ変数を指定する。
この属性を利用した場合、指定されていないメンバ変数だけで等価性を判断する。
of 等価性の判断に含めるメンバ変数を明示的に指定する。

次のページ
自明な型宣言

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

五座 淳一(株式会社DTS)(ゴザ ジュンイチ)

株式会社DTS 金融企画部所属。主に大規模・金融機関向けシステム開発のアーキテクト担当しています。ウォーターフォール型の開発に、CIなどアジャイル開発のプラクティスを取り入れ、開発プロセスの改善を試みています。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7274 2013/08/20 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング