Status Code 303 - See Other

サーバサイド、iOS・アンドロイドアプリ、インフラレベルの話まで幅広くやってます。情報の誤りや指摘・意見などは自由にどうぞ。

Lombok ライブラリ

概要

Javaでは、クラスにフィールドを追加することによって、
既存のロジックに影響が出たり、新しく追加する必要があるメソッドが存在する。

また、これらはフィールドが増えるごとにコードの大部分を占めるようになるにも関わらず、
実装は極めて機械的であり、そのロジックはクラスにとって本質的でないことが多い。
このようなコードをボイラープレートコードという。

今回は、アノテーション記述によって、ボイラープレートコードを自動生成する
Javaライブラリの Lombok を調査してみた。

導入

インストール

個人的に分かりやすかったのは、以下のサイト。
【Java】Lombokで冗長コードを削減しよう | キャスレーコンサルティング 技術ブログ

なお、lombok.jar を Eclipse へのインストールを実行した後は、
eclipse.ini に以下2行が入っているか確認した方が良い。
=============================
-javaagent:lombok.jar
-Xbootclasspath/a:lombok.jar
=============================
私が起動したときは、-Xbootclasspath/a:lombok.jar が記述されて
いなかったため、動かなかった。(Eclipseバージョン: Mars.1 Release (4.5.1))

導入効果

可読性向上

ボイラープレートコードが減ることによって、コードの記述量がはっきりと減る。
同時に、本質的なコードが大部分を占めるようになるため、コードが分かりやすくなる。

保守性向上

フィールドを追加/削除したい場合は、そのフィールドを追加/削除するだけ。
また、関連ロジック (コンストラクタや hashcode/equals/toString メソッド)も
自動で対応するため、そのロジックの整合性を保証できる。

導入例

Before
public class Book {
	private String id;
	private String title;
	private String author;
	private int page;

	public Book(String id, String title, String author, int page) {
		this.id = id;
		this.title = title;
		this.author = author;
		this.page = page;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public int getPage() {
		return page;
	}
	public void setPage(int page) {
		this.page = page;
	}
}
After
import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Book {
	private String id;
	private String title;
	private String author;
	private int page;
}
Use Case
public class Main {
	public static void main(String[] args) {
		Book book1 = new Book("10", "EFFECTIVE JAVA 第2版", "Joshua Bloch", 327);
		Book book2 = new Book("10", "EFFECTIVE JAVA 第2版", "Joshua Bloch", 327);
		Book book3 = new Book("15", "星の王子さま", "サン=テグジュペリ", 245);
		Book book4 = new Book("15", "星の王子さま", "サン=テグジュペリ", 246);

		// toStringメソッド
		System.out.println(book1);
		// equalsメソッド
		System.out.println("book1.equals(book2): " + book1.equals(book2));
		System.out.println("book1.equals(book3): " + book1.equals(book3));
		System.out.println("book3.equals(book4): " + book3.equals(book4));
		// hashCodeメソッド
		System.out.println("book1 hash:" + book1.hashCode() + ", book2 hash: " + book2.hashCode());
		System.out.println("book1 hash:" + book1.hashCode() + ", book3 hash: " + book3.hashCode());
		System.out.println("book3 hash:" + book3.hashCode() + ", book4 hash: " + book4.hashCode());
	}
}
Console Output
Book(id=10, title=EFFECTIVE JAVA 第2版, author=Joshua Bloch, page=327)
book1.equals(book2): true
book1.equals(book3): false
book3.equals(book4): false
book1 hash:712838778, book2 hash: 712838778
book1 hash:712838778, book3 hash: 1107997353
book3 hash:1107997353, book4 hash: 1107997354

Lombok ライブラリ

この他、どのような記述が可能か本家(Lombok)で調査。
(記事執筆時のバージョン :v1.16.6)

規模が大きくなったため、別ページに分割記述。
Lombok ライブラリ - クラス関連 - Status Code 303 - See Other
Lombok ライブラリ - フィールド関連 - Status Code 303 - See Other
Lombok ライブラリ - その他 - Status Code 303 - See Other

対象パッケージ


lombok
lombok のユーザとして必要なクラスや全てのアノテーションを含むパッケージ。
lombok.experimental
長期サポート対象となる前に、その仕様が変更される可能性のある新しいアノテーションを含むパッケージ。
lombok.extern.*
JRE コード以外のライブラリから作成された、ボイラープレートコード問題を解決するアノテーションを含むパッケージ。

今後更新予定


lombok.exprimental
@Accessor, @Delegate, @ExtensionMethod, @FieldDefaults, @Helper, @NonFinal, @PackagePrivate, @Torerate, @UtilityClass, @Wither