137
136

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaでAndroid開発をするなら絶対に導入したいLombok - 超戦士が秘めたる13のパワー[劇場版]

Last updated at Posted at 2014-07-02

#val - 型推論的なもの

Finally! Hassle-free final local variables.

本来であれば

final ArrayList<String> example = new ArrayList<String>();
example.add("Hello, World!");

と書かなければならない所を、右辺でArrayList作って左辺に入れてるんだから、左辺もそりゃArrayListだろ、と推測してくれて

val example = new ArrayList<String>();
example.add("Hello, World!");

と書ける。

らしいのだが「高機能過ぎて怖い」「Javaの教義に反し過ぎてるのでは」といった意見、「valを使うとコマンドラインでのコンパイルが不思議な力で死ぬ事になる」といった風の噂などを考慮して、今やっているPJでは導入は見送っている。

#@NonNull - Nullチェック処理の生成

or: How I learned to stop worrying and love the NullPointerException.

public Example(Person person) {
  super("Hello");
  if (person == null) {
    throw new NullPointerException("person");
  }
  this.name = person.getName();
}

Nullチェック職人が丹精込めて毎朝書いていた処理が

public Example(@NonNull Person person) {
  super("Hello");
  this.name = person.getName();
}

@NonNullアノテーションをつけるだけでよくなる。デフォルトはNullPointerExceptionだが、設定(lombok.config)でIllegalArgumentExceptionに変更する事も出来るらしい。

#@Cleanup - 終了時クリーンアップ処理の生成

Automatic resource management: Call your close() methods safely with no hassle.

@Cleanup InputStream in = new FileInputStream("hoge");

と書くとスコープ脱出時に自動で

in.close()

を呼んでくれるようになる。もちろんクリーンアップ処理がcloseという名前だとは限らないので、その場合は

@Cleanup("dispose") InputStream in = new FileInputStream("hoge");

と書けばcloseではなくdisposeメソッドを呼んでくれるようになる。

#@Getter and @Setter - アクセサ生成

Never write public int getFoo() {return foo;} again.

@Getter @Setter private int age = 10;

とか

@Setter(AccessLevel.PROTECTED) private String name;

みたいに書けばgetterとかsetterを自動生成してくれる。恐らくLombokの中で最も導入コスパが良く最も有名な機能。マジカル度も低いので安心感がある。Objective-Cにおける@propertyみたいなもの。

コードサイズ削減に威力を発揮し、コードレビュやコード修正時にコードを読む者の心の健康を保つのに役立つ。(書く方はIDEによるgetter/setterコード生成と大して変わらない)デメリットとして「フィールド名変更が少し面倒」という話もあるが、AndroidStudio0.6.1+LombokPlugin0.8.6の環境においてはRefactorからRenameすれば綺麗にアクセサ呼び出し部分までリネームしてくれた。かしこい。

なお、色々と設定可能項目がある

  • メソッドチェーンとかFluentInterfaceしたい時用の設定(デフォルト無効)
  • フィールド名にmとかsとか付けたい場合のプレフィックス設定(デフォルト無効)
  • boolean型のgetterの場合はgetHogeではなくisHogeという名前でメソッドを生成するけど別にいいよね設定(デフォルトはisHogeになる)

#@ToString - Pretty-Print

No need to start a debugger to see your fields: Just let lombok generate a toString for you!

クラスの頭に付けておくとtoString時にオブジェクトを見やすい形式で出力してくれる。PHPにおけるvar_dumpとかRubyにおけるppとかそういうの。Rubyよくしらないけど。

#@EqualsAndHashCode - equalsメソッドとhashCodeメソッドのオーバーライド
Equality made easy: Generates hashCode and equals implementations from the fields of your object.

クラスの頭に付けておくとそのクラスのequalsメソッドとhashCodeメソッドをオーバーライドしてくれる。具体的にどういうロジックのequals/hashCodeになるのかはリンク先を参照。同一性比較時に対象外としたいフィールドがあれば

@EqualsAndHashCode(exclude={"id", "shape"})

のように指定すればよい。

#@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor - コンストラクタの生成

Constructors made to order: Generates constructors that take no arguments, one argument per final / non-null field, or one argument for every field.

アノテーション名まま。@NoArgsConstructorをクラスの頭に付ければ引数なしコンストラクタを、@RequiredArgsConstructorなら必須パラメータぽいもの(@NonNullなフィールドとか)を引数として受け取るコンストラクタを、@AllArgsConstructorなら全てのフィールドを引数として受け取るコンストラクタを、それぞれ生成する。

@RequiredArgsConstructor(staticName="of")

みたいに書けばstaticなfactoryメソッドを生成してくれてMapEntry.of("foo", 5)みたいに呼べる。(java.util.EnumSetのofみたいな?)

#@Data - @ToString+@EqualsAndHashCode+@Getter/@Setter+@RequiredArgsConstructor

All together now: A shortcut for @ToString, @EqualsAndHashCode, @Getter on all fields, @Setter on all non-final fields, and @RequiredArgsConstructor!

上記で紹介してきたアノテーションを一行で呼び出せるショートカット。必要に応じて個別のアノテーションで@dataを上書きが可能。ここまで高機能(ジェネレートされる量が多い)になると導入の心理的ハードルはちょっと高い。

#@Value - @Dataのイミュータブル版的な
Immutable classes made very easy.
@Dataと同じく高機能。特徴は

  • オブジェクト生成時にコンストラクタで値を受け取りフィールドに設定する
  • getterは生成されるが、setterは生成されない
  • フィールドにはデフォルトでfinal修飾子がつく

いわゆるValueObject

#@SneakyThrows - チェック例外の無視

To boldly throw checked exceptions where no one has thrown them before!

この秘められた力の封印は無闇に解いてはならない。選ばれし戦士だけがその剣を抜くがいい。

#@Synchronized - メソッドの排他制御

synchronized done right: Don't expose your locks.

メソッドの頭に@Synchronizedを付けると、ロックオブジェクトを用意して排他制御してくれる。

#@Getter(lazy=true) - getter値のキャッシュ
Laziness is a virtue!

コストの高い処理の結果をキャッシュして、キャッシュがあればキャッシュを返してくれるぜイエイ。しかもthread-safeだぜやったー。でも、Lombokを使ってでも実現したいぐらい頻繁にこれを書く事ある?世の中にはあるかもしれない。

#@Log (and friends) - logger生成
Captain's Log, stardate 24435.7: "What was that line again?"

選べる6種類のlogger。@Logならjava.util.logging.Loggerが、@Log4jならorg.apache.log4j.Loggerが、logという名前(設定で変更可能)のフィールドで準備される。

#14番目の力

というわけでアクセサの自動生成だけに留まらないLombokのパワーを13個紹介してきましたが、experimental featuresには、delegateの繋ぎこみ部分を生成してくれる@DelegateBuilderパターン用のビルダーをインナークラスで生成しくれる@Builder、冒涜的な使用例が載っていて怖い@ExtensionMethodなど、魅力的な機能がまだまだ控えているので、用法用量を守ってExperimental because:の部分をちゃんと読んだ上でガンガン服用し、異常が見られた場合には速やかに服用を止め医師の診断を受けましょう。

Lombokの機能全般に言えることですが、メタプロと同様のメリット/デメリットがあるのではないかと個人的には思います。また一部手元で動作確認を行っていない機能もあるため、ご自身でご確認の上ご利用ください。

137
136
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
137
136

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?