Skip to content
lombok
マイコン老年の今時のプログラム技術
2020-06-30

lombok https://projectlombok.org/ の一番分かりやすい機能は @Getter @Setter だろう。

Setter,Getterの話は私はC#の勉強時に知って、ああなるほどと思った。

クラス内のメンバー変数はクラス外で読み書き不要なら他人の処理に壊されないようにprivateにすれば安心である。しかし外から書かれると困るが外から読みたいことは多々ある。そういう変数はprivateに設定した上で読み出し専用のメソッドがあればよいという話。C#はそれを言語の基本レベルで持っている。Javaも意図的にgetData()的に書けば書いていけるが、フィールド数が山ほどになればそれを書くだけで疲れてしまう。

lombokはEclipseに組み込めばアノテーションで@Getterと書くだけで、ソースには見えないgetterのコードが埋め込まれて、別の処理から例えばgetData()と書けば中身を読める。変数そのものはprivateなので外からは壊されない。

@Service
public class AdderService {
  @Getter
  private String data;
}
↓出力classファイルをデコンパイル
@Service
public class AdderService {
  private String data;

  public AdderService() {
  }

// 見えないままに自動生成
  public String getData() {
    return this.data;
  }
}
@Service
public class AdderService {
  @Getter
  private String data;
}
↓出力classファイルをデコンパイル
@Service
public class AdderService {
  private String data;

  public AdderService() {
  }

// 見えないままに自動生成
  public String getData() {
    return this.data;
  }
}

エディタからは直に見えないgetData()というメソッドを他の場所の処理で書ける。ソースを全文検索してもgetDataは見つからないのに処理が通って、プライベート変数が外から読めて、コンパイラも怒らない。昭和プログラマからすればこれは言われなければ分からない。lombokの設定準備が少し特殊(たしかlombok jarファイルを直接起動してEclipse exeを加工するような操作?)な点も含めて、何回も設定しなおしで悩むことになった。

実現手法としては、コンパイル時に処理に割り込んでアノテーションを検索して処理を追加するみたいな感じなのだろう。細かいところは知らない。Javaの仕様に書かれているのだろう。かなりハックめいた手法である。でも考えてみれば自分のLexyも似た観点でOSをハックして英語メッセージを日本語化している。最初に考えた人もわくわくしながら書いたのだろう。

これが便利なのは確かだった。特にorマッパーなどで多量のフィールドを持つデータを格納するクラスの手間や間違い、ソース量を減らし、保守性をかなり上げる。

ただこの時期の新技術は手間を減らす部分が主ではないと思う(後で思った)。React系の直前までの新技術は「プログラムソースはビジネスロジック(仕様書)の事だけを書く」という進化だったのだと思う。