今日からロンボクを使い始めました。これまでのところ気に入っていますが、言及されていない欠点の1つは、サポートのリファクタリングでした。
で注釈が付けられたクラスがある場合は@Data
、フィールド名に基づいてゲッターとセッターが生成されます。これらのゲッターの1つを別のクラスで使用している場合、フィールドの名前が適切でないと判断すると、それらのゲッターとセッターの使用法が検出されず、古い名前が新しい名前に置き換えられます。
これは、LombokではなくIDEプラグインを介して実行する必要があると思います。
更新(2013年1月22日)
Lombokを3か月間使用した後でも、ほとんどのプロジェクトでこれをお勧めします。しかし、私は上記のような別の欠点を見つけました。
クラスがあり、 2つのメンバーがあり、両方に、sayと、MyCompoundObject.java
の注釈が付いている場合、別のクラスから呼び出すと、それがに委任されているのか、IDE内のソースにジャンプできなくなっているのかを知ることはできません。@Delegate
myWidgets
myGadgets
myCompoundObject.getThingies()
Widget
Gadget
Eclipseの「GenerateDelegateMethods...」を使用すると、同じ機能が提供され、同じように高速で、ソースジャンプが提供されます。欠点は、重要なものから焦点を外す定型コードでソースが乱雑になることです。
UPDATE 2(2013年2月26日)
5か月経っても、まだLombokを使用していますが、他にもいくつかの問題があります。宣言されたゲッターとセッターがないことは、新しいコードに慣れようとしているときに迷惑になることがあります。
たとえば、呼び出されたメソッドgetDynamicCols()
が表示されても、それが何であるかわからない場合、このメソッドの目的を判断するためにジャンプするための追加のハードルがいくつかあります。いくつかのハードルはLombokであり、いくつかはLombokスマートプラグインの欠如です。ハードルは次のとおりです。
- JavaDocsの欠如。フィールドをjavadocする場合、getterとsetterがLombokのコンパイル手順を通じてそのjavadocを継承することを期待します。
- メソッド定義にジャンプすると、クラスにジャンプしますが、ゲッターを生成したプロパティにはジャンプしません。これはプラグインの問題です。
- 明らかに、メソッドを生成またはコーディングしない限り、ゲッター/セッターにブレークポイントを設定することはできません。
- 注:この参照検索は、私が最初に思ったように問題ではありません。ただし、アウトラインビューを有効にするパースペクティブを使用する必要があります。ほとんどの開発者にとって問題ではありません。私の問題は、
Outline
ビューをフィルタリングしていたMylynを使用しているため、メソッドが表示されなかったことです。 参照の欠如検索。誰が呼び出しているかを確認したい場合は、参照getDynamicCols(args...)
を検索できるようにセッターを生成またはコーディングする必要があります。
UPDATE 3(2013年3月7日)
Eclipseでさまざまな方法で物事を行う方法を学ぶ。実際には、Lombokで生成されたメソッドに条件付きブレークポイント(BP)を設定できます。ビューを使用してOutline
、メソッドを右クリックしてToggle Method Breakpoint
。次に、BPを押すと、デバッグVariables
ビューを使用して、生成されたメソッドがパラメーターに名前を付けたもの(通常はフィールド名と同じ)を確認し、最後に、Breakpoints
ビューを使用してBPを右クリックしBreakpoint Properties...
、条件を追加することを選択できます。良い。
UPDATE 4(2013年8月16日)
Maven pomでLombokの依存関係を更新する場合、Netbeansはそれを好みません。プロジェクトは引き続きコンパイルされますが、Lombokが作成しているメソッドを確認できないため、ファイルにはコンパイルエラーのフラグが付けられます。Netbeansキャッシュをクリアすると、問題が解決します。Eclipseにあるような「プロジェクトのクリーンアップ」オプションがあるかどうかはわかりません。マイナーな問題ですが、それを知らせたかったのです。
UPDATE 5(2014年1月17日)
Lombokは、Groovy、または少なくともgroovy-eclipse-compiler
。コンパイラのバージョンをダウングレードする必要がある場合があります。
MavenGroovyとJava+Lombok
UPDATE 6(2014年6月26日)
警告の言葉。ロンボクはやや中毒性があり、何らかの理由でそれを使用できないプロジェクトに取り組んでいる場合、それはあなたの腹を立てるでしょう。まったく使用しない方がよい場合があります。
アップデート7(2014年7月23日)これは、OPが求めたロンボクを採用することの安全性
に直接対処しているため、少し興味深いアップデートです。
v1.14以降、@Delegate
アノテーションは実験的ステータスに降格されました。詳細は彼らのサイト(Lombok Delegate Docs)に文書化されています。
この機能を使用していた場合、バックアウトオプションが制限されます。オプションは次のように表示されます。
- 注釈を手動で削除
@Delegate
し、デリゲートコードを生成/ハンドコーディングします。アノテーション内で属性を使用している場合、これは少し難しくなります。
- 注釈が付いているファイルをデロンボックし、必要
@Delegate
な注釈を追加し直します。
- Lombokを更新したり、フォークを維持したりしないでください(または、体験的な機能を使用して生きてください)。
- プロジェクト全体をデロンボクし、ロンボクの使用を停止します。
私の知る限り、Delombokには注釈のサブセットを削除するオプションがありません。少なくとも単一のファイルのコンテキストでは、それはすべてか無かです。Delombokフラグを使用してこの機能をリクエストするチケットを開きましたが、近い将来、それを期待していません。
UPDATE 8(2014年10月20日)
それがあなたのオプションである場合、GroovyはLombokと同じ利点のほとんどに加えて、@Delegateを含む他の機能のボートロードを提供します。アイデアを権力者に売り込むのに苦労すると思われる場合は、@CompileStatic
または@TypeChecked
注釈を見て、それがあなたの目的に役立つかどうかを確認してください。実際、Groovy 2.0リリースの主な焦点は、静的な安全性でした。
UPDATE 9(Sep 1 '15)
Lombokはまだ積極的に維持および強化されており、これは採用の安全レベルの前兆です。@Builderアノテーションは、私のお気に入りの新機能の1つです。
UPDATE 10(2015年11月17日)
これはOPの質問に直接関係しているようには見えないかもしれませんが、共有する価値があります。作成する定型コードの量を減らすのに役立つツールを探している場合は、Google Auto、特にAutoValueを確認することもできます。彼らのスライドデッキを見ると、彼らが解決しようとしている問題の可能な解決策としてロンボクをリストアップしてください。彼らがロンボクについて挙げている短所は次のとおりです。
- 挿入されたコードは表示されません(生成されたメソッドを「見る」ことはできません)[ed note-実際には表示できますが、逆コンパイラが必要です]
- コンパイラのハッキングは非標準で壊れやすいものです
- 「私たちの見解では、あなたのコードはもはや実際にはJavaではありません」
彼らの評価にどれだけ同意するかわかりません。スライドに記載されているAutoValueの短所を考えると、私はLombokに固執します(Groovyがオプションでない場合)。
UPDATE 11(2016年2月8日)SpringRooにも同様の注釈
がある
ことがわかりました。Rooがまだ問題であり、注釈のドキュメントを見つけるのが少し難しいことを知って少し驚いた。取り外しも、デロンボクほど簡単には見えません。ロンボクはより安全な選択のようです。
UPDATE 12(2016年2月17日)
私が現在取り組んでいるプロジェクトにロンボクを安全に持ち込むことが安全である理由を考え出そうとしているときに、追加された金のかけらを見つけましたv1.14
-構成システム!これは、チームが安全でないと見なした、または望ましくないと見なした特定の機能を許可しないようにプロジェクトを構成できることを意味します。さらに良いことに、さまざまな設定でディレクトリ固有の構成を作成することもできます。これは素晴らしいです。
UPDATE 13(2016年10月4日)
この種のことが重要な場合、OliverGierkeはLombokをSpringDataRestに追加しても安全だと感じました。
UPDATE 14(Sep 26 '17) OPsの質問に対するコメントで@gavenkoa
が
指摘しているように、 JDK9コンパイラのサポートはまだ利用できません(問題#985)。また、ロンボクチームが回避するのは簡単な修正ではないようです。
UPDATE 15(2018年3月26日)
Lombokの変更ログには、v1.16.20の時点で、 #985がまだ開いていても、「JDK1.9でのlombokのコンパイルが可能になりました」と示されています。
ただし、JDK9に対応するための変更には、いくつかの重大な変更が必要でした。設定のデフォルトの変更にすべて分離されています。彼らが重大な変更を導入したことは少し心配ですが、バージョンは「インクリメンタル」バージョン番号(v1.16.18からv1.16.20に移行)のみを上げました。この投稿は安全性に関するものだったのでyarn/npm
、最新のインクリメンタルバージョンに自動的にアップグレードする同様のビルドシステムがある場合は、失礼な目覚めに陥る可能性があります。
UPDATE 16(19年1月9日)
JDK9の問題は解決され、LombokはJDK10、さらにはJDK11でも動作するようです。
安全性の観点から気付いたのは、v1.18.2からv1.18.4への変更ログに2つの項目がBREAKING CHANGE
!?semverの「パッチ」アップデートで重大な変更がどのように発生するかわかりません。パッチバージョンを自動更新するツールを使用する場合、問題になる可能性があります。
UPDATE 17(21年3月17日)
Lombok開発者とOpenJDK開発者の間でJDK16の周りにいくつかのドラマが展開されてい ます。JDK開発者は、LombokがJDKチームが閉じたいループホールを介して未公開のJDK内部を利用していると主張していますが、さまざまな理由で意図的に開いたままにしています。
彼らは(ロンボクの安全性について)懸念を次のように述べています。
内部へのすべてのアクセスは、クライアントアプリケーションが明示的に許可し、これに伴うメンテナンス(またはセキュリティ)の問題を故意に引き受けていることを認める限り、以前と同じように利用できます。
LombokはOpenJDKをだましていると思うかもしれませんが、彼らがしているのは、自分のユーザーをだまそうとしていることを発表することだけです。
ロンボクがJDKのセキュリティ制限に関するこれ以上の創造的な解決策を見つけることができなくなる日がすぐに来るかもしれません。たとえそうだとしても、プロジェクトでLombokを使用することの安全性に疑問があるかもしれません。