ScalaとLombokを比べた場合のメリットとデメリット

最近いくつかlombokが話題になってた

ので、twitterなどでは何度かつぶやいた私見を、改めてblogにも書いておこうかと思います。Scalalombokも好きなので、ある意味「Scala使えばいいじゃん」という単純な意見に対する反論でもあります。

lombok自体のそれぞれの細かい機能の紹介は、先ほど上げたリンク先で既に語られてるのでしません。


lombokScalaに比べて優れている点

  • IDEの恩恵
    • (自分はeclipseである程度やっていましたが)ほぼ素のJavaを書いているときと同じくらいの快適さです。対して、Scalaでは、IDEAだろうがeclipseだろうが、JavaIDEで書くときと比べて全体的にまだまだ劣っています。
  • コンパイル時間

個人的意見としては、上記2点がかなり大きいです。「Javaからの移行のしやすや、取っ付きやすさ」を上げる人がいるかもしれません。もちろんそれもlombokのメリットだとは思います。しかし、Scalaの言語自体に慣れれば「移行のしやすや、取っ付きやすさ」は、ある程度どうにかなるのに対して、IDEの問題とコンパイル時間は、いくらScalaに慣れてもどうにもなりません。まぁIDEのほうは
IDEの支援があっても無くても変わらないくらいの境地に達してスラスラ書ける」
というのはありえるかもしれませんが、コンパイル時間は本当に頑張っても現状はどうしようもありません。


あとはlombokに関しては「Androidのユーザーに勧めたい」です。理由としては

  • runtimeのjarサイズとproguard
    • Scalaではサイズ的に必ずproguardしないといけなくて、色々その設定ではまったり面倒
    • 対してlombokは1.8MB*1ほどしかないので、proguardやらずにそのままつっこめる
    • Scalaだと「proguard必須」+ 「コンパイル遅い」のダブルのデメリットにより「コード変更 => 実機にインストール => デバック」のサイクルが超遅くなる
  • IDE
    • Andoridプログラミングでは、Javaなどでのロジックのコーディング以外にも、xmlでviewを大量に書く必要があるわけですが「Scalaで快適なAndroidIDE環境」を整えるのがかなり難しい。最善を尽くしたとしても、コンパイル時間と、もともとのIDEの貧弱さから、イライラすることが多々ある。

ちなみに、Androidlombokやるには少し設定が必要です
http://projectlombok.org/setup/android.html
が、逆にlombokの公式ページに専用のページがあるように、ある程度公式的にAndroidに関して力を入れているようです。個人的に「lombok + Android」やってたことがあるのですが、手順通りやれば「lombok + Android特有の問題」にハマったことはありませんでした。



まとめると、Scala
「新しい機能が多い(=メリットが大きい)代わりに、Javaと比べて明らかなデメリット(IDE問題、コンパイル時間)が数点ある」
のに対して、lombokでは
Scalaにおいてのデメリット(IDE問題、コンパイル時間)がほぼ生じない」*2
ということです。(当たり前ですが、そのかわりScalaに比べたら機能は圧倒的に少ない)
Scalaは学習していって、「Scalaのメリットがデメリットを上回って、Javaを使うよりも生産性を発揮できる」のに時間がかかったり、その「Javaを使うよりも生産性を発揮できる」時点に到達するまでの期間がはっきり予測できないのに対して、lombokの場合は「Scalaのように"明らかに目立つデメリット"が最初からほとんどない」ということです。*3



あと、上記の3つのリンク先でどれも言っていないけれど、重要なことだと思うので改めて書いておきますが、lombok
eclipseコンパイラではコンパイルできるのに、javacではコンパイルできなくなる」
という現象が発生することがあります。発生条件はよく分かってませんが、valを多用すると起きるようです。(これ書いてる時点で最新のlombok0.12.0で確認)

実際のエラーはこんな感じ https://gist.github.com/xuwei-k/6126569

そうすると

  • jenkinsでのビルドできなくなる?
  • mavenやsbtやgradleなどでもビルドできなくなる?

などの問題が発生します。上記のツールが間接的にeclipseコンパイラを使えるように設定できれば、問題なくなるでしょう・・・。が、自分がsbtでやろうとしたときは全然うまくいきませんでした。だれかその辺のノウハウ(javacでコンパイルできなくなる詳細な条件、eclipseコンパイラを他のツールから使う方法)まとめてください。以前調べたときは、mavenならeclipseコンパイラ使うことできるらしい・・・という情報は見つけましたが、自分では試しませんでした。



あと最後に、以前「ブラウザ上でlombokのコードがどのようにJavaに展開されるか確かめることができるサイト作ったよ」という宣伝
http://lombok.herokuapp.com
https://github.com/xuwei-k/lombok.herokuapp.com

*1:Androidの場合、lombok-api.jarというのを生成して、それを組み込むという仕組みだったはずなので、たしかもっと小さくなったかも。1.8MBはもとのlombok.jarのサイズ

*2:すごくコード量多いのをlombok使ってやってたわけではないので、「実はlombokもコード量多くなると(ry」という問題あるなら教えてください

*3:あえて他にデメリットというか心配事を上げるなら、社内で採用する際の政治的な事情とか、Java8対応含めた今後の将来性などでしょうが、そのあたりはScalaも同じ心配はあるでしょう