LoginSignup
3
0

More than 3 years have passed since last update.

Lombokのカスタムアノテーションを作ろうとして諦めたメモ

Posted at

Lombokのカスタムアノテーションを作ろうとして諦めたメモです。

3行でまとめ:

  1. Lombokのアノテーション実装ではJava内部クラス(コンパイラ関連)を参照する。
  2. Java9 以降、Java内部クラスの参照方法がビルドシステムやIDEで大きく変わり、難易度がめちゃくちゃ高くなった。
  3. アノテーションを集約するメタアノテーション的なのもLombokでは未対応なので、打つ手なし、ギブアップ。

作ろうとした経緯:

  1. @Value 大好きなんだけど、Eclipse上からlombokが作成したgetterの利用箇所を Ctrl + Shift + F で逆引きできない。というかしづらい。
  2. そもそも Immutable なデータ構造体として @ToString @EqualsAndHashCode @AllArgsConstructor をまとめて付けたいがための @Value で、個人的な好みとして getter 要らない。データ構造としてのフィールドは public final でえーやろ、という割り切り。
  3. よし、カスタムアノテーション作ってみるか・・・ な~に、@Value のソースパクって、@Getter 機能呼び出してるところ削ればおしまいじゃろ。

ということで、まずは Lombok でカスタムアノテーション作るイロハをググった:

うん、予想はしてたけど Java のバイトコードのガチ操作でめんどくさそうだし難易度も高い。止めようかな・・・。
いやいや、そもそも作りたいのは @Value - @Getter なのだから、@Value のソースコードはどうなってる?

handleFieldDefaults.generateFieldDefaultsForType(typeNode, annotationNode, AccessLevel.PRIVATE, true, true);
handleConstructor.generateAllArgsConstructor(typeNode, AccessLevel.PUBLIC, staticConstructorName, SkipIfConstructorExists.YES, annotationNode);
handleConstructor.generateExtraNoArgsConstructor(typeNode, annotationNode);
handleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, List.<JCAnnotation>nil());
handleEqualsAndHashCode.generateEqualsAndHashCodeForType(typeNode, annotationNode);
handleToString.generateToStringForType(typeNode, annotationNode);

ここまででコピペ自体は行けそうだが、ふと「あれ・・・そういえば com.sun.tools 系使ってるよな・・・。この辺、java9のmodule導入の影響ガチで受けてるとこだし、どうすりゃいいんだ・・・」と途方に暮れる。

とりあえず java8 時代までの com.sun.tools を maven で扱うときの記事をググった。

そうそう、こんな感じでした。では java9 でどうなったかちょっとぐぐってみると・・・

めっちゃ雲行き怪しい。というかすでに阿鼻叫喚。ヤバい。
これに Eclipse 側の対応も・・・と軽くぐぐってみると、若干内容は異なるものの、いずれもJava内部クラスへのアクセスで苦労されてる様子:

これはまずい。maven/pom.xml の調整がまずヤバそうだし、それとEclipse側の組み合わせも複雑さを跳ね上げてる。

そもそも、(今回の調査で初めて知った)サードパーティ製のLombokカスタムアノテーションを集めた https://github.com/peichhorn/lombok-pg も、そしてLombok 本体もビルドは Ant を使ってる様子。Eclipse IDE用にも結構調整入ってる雰囲気。(IDEに組み込むものなのか、IDEで開発するときのためのものかまでは不明だけどどちらにしても結構面倒くさそう)

トドメに、Java9 以降でLombokメンテすることの大変さが忍ばれる記事発見。

うーん、カスタムアノテーションがだめだったら、既存のアノテーションを集約するメタアノテーション的なのは作れないかな?とググってみたが・・・

どうやら難しそうで未対応とのこと。

以上を考えるに、そもそもやりたいのは以下のアノテーションを付けるのを簡単にしたいだけ・・・にも関わらず、実現するためのコストが異常に高い。

@AllArgsConstructor
@EqualsAndHashCode
@ToString
(場合によっては @With )

よって、今回はカスタムアノテーションを作成するのは一旦あきらめ、無難に必要なものだけコピペしてくことにする。

3
0
0

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
3
0