KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

Java Tips -=-= Library =-=- Lombok Part 2

LINEで送る
[`evernote` not found]
Pocket

前回に引き続き画期的なライブラリ【Lombok】を紹介します。

Lombokとは

読み方は「ロンボック」または、「ロンボク」と読むようです。
クラスやメソッドにアノテーションをつけるだけで、Setter、Getter、toString、equalsなど繰り返し何度も書くコードを自動保管してくれます。
簡単に説明すると、ソースコード上SetterやGetterがなくても、コンパイルエラーにはならず、クラス外からSetterやGetterが利用できます。
更に、クラスファイルには変換済みのコードをベースにコンパイルされたコードが格納されているため、実行時にはLombokが必要ありません。

使用方法

Lombokで使える機能は以下の通りです。
この中から使い勝手の良さそうな機能をチョイスして、ご紹介していこうと思います。
各機能の解説は面白かったので、翻訳内容をそのまま載せています。

– val
手間のかからないfinal変数

– @NonNull
NullPointerExceptionを気にすることをやめ、愛する方法を学んだ

– @Cleanup
自動リソース管理:close()メソッドを面倒なく安全に呼び出します

– @Getter / @Setter
`public int getFoo() {return foo;}`を二度と書くことはありません。

– @ToString
あなたのフィールドを見るためにデバッガを起動する必要はありません:ロンボクにあなたのためのtoStringを生成させてください!

– @EqualsAndHashCode
平等化が容易:オブジェクトのフィールドからhashCodeを生成し、実装と同等になります。

– @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
順序付けられたコンストラクター:引数を取らないコンストラクター、最終フィールド/非NULLフィールドごとの1つの引数、またはすべてのフィールドの1つの引数を生成します。

– @Data
すべて一緒に:@ToString、@EqualsAndHashCode、すべてのフィールドで@Getter、およびすべての非最後のフィールドで@Setter、@RequiredArgsConstructorのショートカット!

– @Value
不変クラスは非常に簡単にできました。

– @Builder
ボブのおじさん:オブジェクト作成用の面倒なファンシーパンツ!

– @SneakyThrows
前に誰も投げ入れていない場所で、チェック例外を大胆に投げる!

– @Synchronized
同期が完了しました。ロックを公開しないでください。

– @Getter(lazy=true)
怠惰は美徳です!

– @Log
キャプテンズ・ログ、スターディート 24435.7:「その行は何だったの?」

まず始めに、`@val`です。

– val
実際に型を書く代わりに、valをローカル変数宣言の型として使用できます。 これを行うと、型はイニシャライザ式から推論されます。
ローカル変数も最終的に作成されます。
この機能は、ローカル変数やforeachループでのみ機能し、フィールドでは機能しません。イニシャライザ式が必要です。

実際のコード(With Lombok)

import java.util.ArrayList;
import java.util.HashMap;
import lombok.val;

public class ValExample {
  public String example() {
    val example = new ArrayList<String>();
    example.add("Hello, World!");
    val foo = example.get(0);
    return foo.toLowerCase();
  }
  
  public void example2() {
    val map = new HashMap<Integer, String>();
    map.put(0, "zero");
    map.put(5, "five");
    for (val entry : map.entrySet()) {
      System.out.printf("%d: %s\n", entry.getKey(), entry.getValue());
    }
  }
}

同等の機能を持つコード(Vanilla Java)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class ValExample {
  public String example() {
    final ArrayList<String> example = new ArrayList<String>();
    example.add("Hello, World!");
    final String foo = example.get(0);
    return foo.toLowerCase();
  }
  
  public void example2() {
    final HashMap<Integer, String> map = new HashMap<Integer, String>();
    map.put(0, "zero");
    map.put(5, "five");
    for (final Map.Entry<Integer, String> entry : map.entrySet()) {
      System.out.printf("%d: %s\n", entry.getKey(), entry.getValue());
    }
  }
}

続いて`@NonNull`です。

– @NonNull
メソッドやコンストラクタのパラメータに@NonNullを使用すると、lombokにヌルチェック文を生成させることができます。
Lombokは、@Dataなどのように、lombokがメソッドまたはコンストラクタ全体を生成する場合、nullチェックを生成するシグナルとして、
フィールド上の@NonNullというアノテーションを常にシグナルとして扱います。
ただし、lombok独自の@lombok.NonNullをパラメータに使用すると、独自のメソッドまたはコンストラクタ内にnull-check文が挿入されます。

nullチェックは、

  if (param == null) throw new NullPointerException("param");

のようになります。 あなたのメソッドの一番上に挿入されます。
コンストラクタでは、明示的なthis()またはsuper()呼び出しの直後にnullチェックが挿入されます。

上部にnullチェックが既に存在する場合、追加のnullチェックは生成されません。

実際のコード(With Lombok)

import lombok.NonNull;

public class NonNullExample extends Something {
  private String name;
  
  public NonNullExample(@NonNull Person person) {
    super("Hello");
    this.name = person.getName();
  }
}

同等の機能を持つコード(Vanilla Java)

import lombok.NonNull;

public class NonNullExample extends Something {
  private String name;
  
  public NonNullExample(@NonNull Person person) {
    super("Hello");
    if (person == null) {
      throw new NullPointerException("person");
    }
    this.name = person.getName();
  }
}

最後に`@Clean`をご紹介します。

– @Cleanup
@Cleanupを使用すると、コード実行パスが現在のスコープを終了する前に、特定のリソースが自動的にクリーンアップされるようにすることができます。
これを行うには、@Cleanupアノテーションを使用してローカル変数宣言に注釈を付けます。

  @Cleanup InputStream in = new FileInputStream("some/file");

結果として、スコープの終わりに、in.close()が呼び出されます。この呼び出しは、try/finally構造を介して実行されることが保証されています。
これがどのように機能するかは、下の例を見てください。

クリーンアップしたいオブジェクトの型にclose()メソッドがありませんが、引数を持たないその他のメソッドがある場合は、このメソッドの名前を次のように指定できます。

  @Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);

デフォルトでは、クリーンアップメソッドはclose()とみなされます。1つ以上の引数を取るクリーンアップメソッドは、@Cleanup経由で呼び出すことはできません。

実際のコード(With Lombok)

import lombok.Cleanup;
import java.io.*;

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    @Cleanup InputStream in = new FileInputStream(args[0]);
    @Cleanup OutputStream out = new FileOutputStream(args[1]);
    byte[] b = new byte[10000];
    while (true) {
      int r = in.read(b);
      if (r == -1) break;
      out.write(b, 0, r);
    }
  }
}

同等の機能を持つコード(Vanilla Java)

import java.io.*;

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
      OutputStream out = new FileOutputStream(args[1]);
      try {
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      } finally {
        if (out != null) {
          out.close();
        }
      }
    } finally {
      if (in != null) {
        in.close();
      }
    }
  }
}

val、@NotNull、@Creanupの紹介でした。
次回も引き続き【Lombok】ご紹介いたします。

【関連記事】
Google App Engine 第一回
Google App Engine 第二回
Javaのライブラリを手軽にテストしたい!! Groovy入門 第1回
Google App Engine 第三回
Google App Engine 第四回
Google App Engine 第五回
Google App Engine 第六回
Google App Engine 第七回
Google App Engine 第八回
Google App Engine 第九回
Google App Engine 第十回
Google App Engine 第十一回
Google App Engine 第十二回
AngularJS入門01
AngularJS入門02
AngularJS入門03
AngularJS入門04
AngularJS入門05
AngularJS入門06
AngularJS入門07
AngularJS入門08
AngularJS入門09
攻略 Elevator Saga =基本編=
攻略 Elevator Saga =応用編=
Java Tips -=-= Library =-=- JodaTime [前半]
Java Tips -=-= Library =-=- JodaTime [後半]
Java Tips -=-= Library =-=- Lombok Part 1

LINEで送る
[`evernote` not found]
Pocket