---
title: Project LombokでGetter・Setter定義におさらば！ jjug
tags: []
categories: ["Programming", "Java", "lombok"]
date: 2012-11-13T18:11:55Z
updated: 2012-12-03T19:15:52Z
---

[Java Advent Calender 2012][1] 4日目の記事です。

[Project Lombok](http://projectlombok.org/)はJavaBeanのGetter/Setterのようなboilerplateをなくすためのアノテーション群です。

クラスやフォールドにアノテーションを付けるだけでGetter/Setterやコンストラクタ、toStirng、hashCode/equalsといったお決まりコードを省略できます(自動でバイトコードを生成します)。
サポートしているアノテーションは[こんな](http://projectlombok.org/features/index.html)感じ。

`@Data`をつけると、getter/setter/toString/hashCodeやらなんやら全部ついてきます。

    package com.example.lombok.domain;
    
    import java.io.Serializable;
    import java.util.Date;
    
    import lombok.Data;
    
    @Data
    public class Employee implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private Long id;
    
        private String firstName;
    
        private String lastName;
    
        private String dept;
    
        private String gender;
    
        private Date birthDay;
    }

もちろんこれまでもEclipseで自動生成することはできていましたが、自動生成にくらべてのメリットはフィールドの変更に強いということです。フィールド名や型が変わってもGetter/Setterを直す手間がかかりません。

### インストール
基本的にはlombokのjarをクラスパスに追加して、アノテーションを付けるだけで良いのですが、IDEと連携するには少し設定が必要です。

[http://projectlombok.org/download.html](http://projectlombok.org/download.html)からjarをダウンロードしてダブルクリックします。インストーラーが自動でIDEの場所を検出し、設定ファイルを書き換えてくれます。

<a href='/api/v1/files/00081/ss01.png'><img src='/api/v1/files/00081/ss01.png' /></a>

MacのSTSの場合`springsource/sts-3.1.0.RELEASE/STS.app/Contents/MacOS/`以下にlombok.jarがコピーされ、STS.iniに

    -javaagent:lombok.jar
    -Xbootclasspath/a:lombok.jar

が追加されていました。

IDEを再起動すれば、`@Data`をつけるとアウトラインに各種Getter/Setterが出現します。


<a href='/api/v1/files/00082/ss02.png'><img src='/api/v1/files/00082/ss02.png' /></a>

### サンプル
IDEサポートが完了すればあとはプロジェクト側でlombokのjarを追加すればOKです。Mavenの場合はpom.xmlに以下を追加

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>0.11.6</version>
        <scope>provided</scope>
    </dependency>

#### @Dataの例
JavaBean

    package com.example.lombok.domain;
    
    import java.io.Serializable;
    import java.util.Date;
    
    import lombok.Data;
    
    @Data
    public class Employee implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private Long id;
    
        private String firstName;
    
        private String lastName;
    
        private String dept;
    
        private String gender;
    
        private Date birthDay;
    }

JUnit

    package com.example.lombok.domain;
    
    import static org.junit.Assert.*;
    import static org.hamcrest.CoreMatchers.*;
    
    import java.util.Date;
    
    import org.junit.Test;
    
    public class EmployeeTest {
    
        @Test
        public void testToString() {
            Employee e = new Employee();
            e.setId(1L);
            e.setFirstName("Toshiaki");
            e.setLastName("Maki");
            e.setDept("R&D");
            e.setGender("male");
            e.setBirthDay(new Date(0));
    
            assertThat(e.getId(), is(1L));
            assertThat(e.getFirstName(), is("Toshiaki"));
            assertThat(e.getLastName(), is("Maki"));
            assertThat(e.getDept(), is("R&D"));
            assertThat(e.getGender(), is("male"));
            assertThat(e.getBirthDay(), is(new Date(0)));
            assertThat(
                    e.toString(),
                    is("Employee(id=1, firstName=Toshiaki, lastName=Maki, dept=R&D,"
                            + " gender=male, birthDay=Thu Jan 01 09:00:00 JST 1970)"));
        }
    }

#### ToStringの内容を絞る例

JavaBean

    package com.example.lombok.domain;
    
    import java.io.Serializable;
    import java.util.Date;
    
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    @Getter
    @Setter
    @ToString(of = { "firstName", "lastName" })
    public class Employee2 implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private Long id;
    
        private String firstName;
    
        private String lastName;
    
        private String dept;
    
        private String gender;
    
        private Date birthDay;
    }

JUnit


    package com.example.lombok.domain;
    
    import static org.hamcrest.CoreMatchers.is;
    import static org.junit.Assert.*;
    
    import java.util.Date;
    
    import org.junit.Test;
    
    public class Employee2Test {
    
        @Test
        public void testToString() {
            Employee2 e = new Employee2();
            e.setId(1L);
            e.setFirstName("Toshiaki");
            e.setLastName("Maki");
            e.setDept("R&D");
            e.setGender("male");
            e.setBirthDay(new Date(0));
    
            assertThat(e.getId(), is(1L));
            assertThat(e.getFirstName(), is("Toshiaki"));
            assertThat(e.getLastName(), is("Maki"));
            assertThat(e.getDept(), is("R&D"));
            assertThat(e.getGender(), is("male"));
            assertThat(e.getBirthDay(), is(new Date(0)));
            assertThat(e.toString(),
                    is("Employee2(firstName=Toshiaki, lastName=Maki)"));
        }
    
    }

#### Immutableな例

JavaBean?

    package com.example.lombok.domain;
    
    import java.io.Serializable;
    import java.util.Date;
    
    import lombok.AllArgsConstructor;
    import lombok.Getter;
    import lombok.ToString;
    
    @Getter
    @AllArgsConstructor
    @ToString
    public class Employee3 implements Serializable {
        private static final long serialVersionUID = 1L;
    
        final private Long id;
    
        final private String firstName;
    
        final private String lastName;
    
        final private String dept;
    
        final private String gender;
    
        final private Date birthDay;
    }

JUnit

    package com.example.lombok.domain;
    
    import static org.junit.Assert.*;
    import static org.hamcrest.CoreMatchers.*;
    
    import java.util.Date;
    
    import org.junit.Test;
    
    public class Employee3Test {
    
        @Test
        public void testToString() {
            Employee3 e = new Employee3(1L, "Toshiaki", "Maki", "R&D", "male", new Date(0));
    
            assertThat(e.getId(), is(1L));
            assertThat(e.getFirstName(), is("Toshiaki"));
            assertThat(e.getLastName(), is("Maki"));
            assertThat(e.getDept(), is("R&D"));
            assertThat(e.getGender(), is("male"));
            assertThat(e.getBirthDay(), is(new Date(0)));
            assertThat(
                    e.toString(),
                    is("Employee3(id=1, firstName=Toshiaki, lastName=Maki, dept=R&D,"
                            + " gender=male, birthDay=Thu Jan 01 09:00:00 JST 1970)"));
        }
    }


----

ちなみに実行するだけならIDEサポート入りません。

    package com.example.lombok.app;
    
    import java.util.Date;
    
    import com.example.lombok.domain.Employee;
    
    public class Main {

        public static void main(String[] args) {
            Employee e = new Employee();
            e.setId(1L);
            e.setFirstName("Toshiaki");
            e.setLastName("Maki");
            e.setDept("R&D");
            e.setGender("male");
            e.setBirthDay(new Date(0));
            System.out.println(e);
        }
    
    }

実行

    $ mvn exec:java -Dexec.mainClass=com.example.lombok.app.Main
    Employee(id=1, firstName=Toshiaki, lastName=Maki, dept=R&D, gender=male, birthDay=Thu Jan 01 09:00:00 JST 1970)


明日は5日目[@nabedge][2]さんの番です！ 


  [1]: http://atnd.org/events/33871
  [2]: https://twitter.com/nabedge
