私は新年のパフォーマンス目標を考えています。コードベース、特にボイラープレートのサイズを縮小するという目標を立てるのは楽しいと思いました。これに対処するために私が思いついたアクションの1つは、 Project Lombok を使用してBeanをできるだけ短くすることです。しかし、私は新しいソフトウェアやアプローチの欠点を見落とす習慣があるので、Stack Overflowコミュニティに頼っています。ロンボクが悪い考えである理由を誰かに教えてもらえますか?
主な欠点はIDEサポートです。 Lombokは実際には言語の変更ではなく、IDEはJavaしか理解しないため、正しく機能させるにはLombokをサポートするIDEが必要になります。今のところ、 それはEclipseだけです これにはEclipseとIntelliJが含まれます。 Eclipseを使用している場合は問題ないかもしれませんが、将来の開発者のためにも決定を下していることを忘れないでください。
コードの一部をgroovyなどのあまり儀式的でない言語に移動することを検討することをお勧めします。ビジネスロジックとモデルの一部をGroovyに移行することに成功し、非常にスムーズに機能します。
Lombokの制限は、Javaコンパイラーと密接に関連しているという事実です。アノテーションプロセッサーAPIは、コンパイル中にのみ新しいファイルの作成を許可するため(既存のファイルの変更は許可されない) lombokは、そのAPIをエントリポイントとして使用してJavaコンパイラを変更します。残念ながら、これらのコンパイラの変更により、非公開APIが多用されます。lombokを使用することをお勧めしますが、注意が必要です。コンパイラをアップグレードするとコードが破損する可能性があります。可能性は低いですが、非公開APIを使用することは常に不快です。
私の意見では、「Java + Lombok」のソースコードはJavaソースコードではなくなりました。何年も前にBorlandC++ Builderで作成されたBorland社に似たものだと思いますIDE-C++コードに「プロパティ」を導入し、C++ではなくなった(C++言語の標準という意味ではC++ではない)新しいプログラミング言語を効果的に導入しました。「Java + Lombok」を使用するソースは次のとおりです。 Java言語仕様の意味で有効なソースではありません。さらに、注釈は言語のセマンティクスに影響を与えるように設計されていなかったと思います。
Lombokのようなものの潜在的な欠点の1つは、セッター/ゲッターが「欠落」していると、ソースツールが結果のオブジェクトの「bean」品質を与える側面を「認識」しない可能性があることです。これらの品質はコンパイルされたクラスでのみ現れるためです。
もう1つの欠点は、ツールチェーン内の「黒魔術」のもう1つの部分であるということです。幸いなことに、それはかなり良性の部分のようであり(私はそれを使用していません)、実行時ではなくコンパイル時に発生するという事実は実際には祝福です(IMHO)。ただし、プロジェクトがないとコードベースにアーティファクトが追加されるため、コードを再利用したり共有したりすることはできません。したがって、コンパイルされたクラスファイルは「POJO」である可能性がありますが、ソースコードはPOJOではないと主張します。
これらはどちらも不利な欠点ではなく、楽しみにしていることを知っておくべき側面にすぎません。
これはサードパーティのライブラリであり、よく知らない開発者もいます。
IDEは注釈処理をサポートする必要があります(IDEAおよびEclipse用のプラグインがあります)。
上で述べたように、コードにはゲッター/セッターがありません。ソナー/チェックスタイル違反につながります。
ユーザーが指摘したように @ Jcs 別の回答で、さらに追加したいと思います。
私たちのプロジェクトでは、マッパークラスの生成に使用されるmapstructを使用しています。コードがコンパイルされる前に、mvn generate-sourcesコマンドを使用して、これはmavenプロセッサプラグインを使用してプロセスフェーズで実行されます。
プロジェクトlombokは、コンパイルフェーズでクラスファイルのgetter/setterのバイトコードを追加します。
プロセスフェーズはコンパイルの前に実行されるため、クラスで使用可能なゲッター/セッターがないことがわかります。
コンパイルフェーズを複数実行するために利用できるいくつかの回避策があります。詳細については、これを参照してください gitハブチケット 。
注:私はSpringのSTS ideを使用しており、lombokでサポートされています:)