読者です 読者をやめる 読者になる 読者になる

覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。 twitter: @yyoshikaw

Lombokを用いた開発 (1)

Java Lombok

Lombokを利用する主な目的にJavaのお決まりのコード(ボイラープレートコード)を削減することがあげられます。
その目的のために頻繁に使用するアノテーションがいくつか存在しています。
本記事では利用頻度の高いアノテーションのいくつかをピックアップして概要を記載します

Lombokを用いてIDEで開発する場合は基本的にIDEにLombokをインストールしている必要があります。
IDEへのインストールについては以下エントリを参考にしてください


lombok.Data

対象クラスに@Data(lombok.Data)アノテーションを付与することで、メンバのgetter/setterが自動生成された(いわゆるJavaBeansを記載した)状態になります。
かつ、toString, equals, hashCode も適切にオーバーライドされます。

■@Dataアノテーションを付与したクラス

import lombok.Data;

@Data
public class Person1 {

    private long id;

    private String name;

    private int age;
}

■IDEでの表示状態

コード上はメンバしか存在しないにも関わらず、アウトラインにはgetter/setter等が存在しています

f:id:nini_y:20160927052909p:plain

■利用側のコード

コード上はgetter/setter等は存在しないクラスのgetter/setterが利用できます。

import sample.Person1;

public class Person1Client {

    public static void main(String[] args) {
        Person1 p = new Person1();
        p.setId(10001L);
        p.setName("LombokTaro");
        p.setAge(25);

        System.out.println("Person1#getId: " + p.getId());
        System.out.println("Person1#getName: " + p.getName());
        System.out.println("Person1#getAge: " + p.getAge());

        System.out.println("Person1#toString: " + p);
    }

}

■実行結果

Person1#getId: 10001
Person1#getName: LombokTaro
Person1#getAge: 25
Person1#toString: Person1(id=10001, name=LombokTaro, age=25)

■関連エントリ

lombok.Dataについては以下ページも参照ください。


lombok.Value

対象クラスに@Value(lombok.Value)アノテーションを付与すると、対象クラスのfinal化、メンバのfinal化、引数付きコンストラクタ、メンバのgetterが自動生成された状態(いわゆるImmutableなクラス)になります。
かつ、toString, equals, hashCode も適切にオーバーライドされます。

■@Valueアノテーションを付与したクラス

import lombok.Value;

@Value
public class Person2 {

    private long id;

    private String name;

    private int age;
}

■IDEでの表示状態

コード上はメンバしか存在しないにも関わらず、アウトラインには引数付きコンストラクタ、getter等が存在しています

f:id:nini_y:20160927053346p:plain

■利用側のコード

コード上getter等は存在しないクラスのgetterが利用できます。(setterは利用できません)

import sample.Person2;

public class Person2Client {

    public static void main(String[] args) {
        long id = 1234500;
        String name = "LombokHanako";
        int age = 34;
        Person2 p = new Person2(id, name, age);

        // setterは利用できない
        // p.setId(10001L);
        // p.setName("LombokTaro");
        // p.setAge(25);

        System.out.println("Person2#getId: " + p.getId());
        System.out.println("Person2#getName: " + p.getName());
        System.out.println("Person2#getAge: " + p.getAge());

        System.out.println("Person2#toString: " + p);
    }

}

■実行結果

Person2#getId: 1234500
Person2#getName: LombokHanako
Person2#getAge: 34
Person2#toString: Person2(id=1234500, name=LombokHanako, age=34)


lombok.Getter/lombok.Setter

対象クラスやメンバに@Getter, @Setterアノテーションを付与すると、クラス内のメンバのgetter/setterが自動生成された状態になります。

■@Getter, @Setterアノテーションを付与したクラス

アノテーションはメンバおよびクラスに付与することができます

import lombok.Getter;
import lombok.Setter;

// メンバにアノテーションを付与
public class Person3 {

    @Getter
    private long id = System.currentTimeMillis();

    @Getter
    @Setter
    private String name;

    @Setter
    private int age;
}
import lombok.Getter;
import lombok.Setter;

// クラスとメンバにアノテーションを付与
@Getter
public class Person4 {

    private long id = System.currentTimeMillis();

    @Setter
    private String name;

    @Setter
    private int age;
}

■IDEでの表示状態

f:id:nini_y:20160927053734p:plain

f:id:nini_y:20160927053744p:plain

■利用側のコード

import sample.Person3;
import sample.Person4;

public class Person3and4Client {

    public static void main(String[] args) {
        Person3 p1 = new Person3();
        p1.setName("LombokTaro");
        p1.setAge(25);
        // p1.setId(10001L); <-- setterが存在しない

        System.out.println("Person3#id: " + p1.getId());     // id項目に対するgetterが存在する
        System.out.println("Person3#name: " + p1.getName()); // name項目に対するgetterが存在する

        // System.out.println("Person3#age: " + p1.getAge()); // age項目に対するgetterが存在しない
        
        
        Person4 p2 = new Person4();
        p2.setName("LombokTaro");
        p2.setAge(25);
        // p.setId(10001L); <-- setterが存在しない

        // クラス内の全メンバに対するgetterが存在する
        System.out.println("Person4#id: " + p2.getId());
        System.out.println("Person4#name: " + p2.getName());
        System.out.println("Person4#age: " + p2.getAge());
    }

}

■実行結果

Person3#id: 1474922349029
Person3#name: LombokTaro
Person4#id: 1474922349033
Person4#name: LombokTaro
Person4#age: 25



関連エントリ