UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Java】Lombokの@SneakyThrows を使用した場合、lombok.jarはクラスパスに必要になるかどうか

Lombokの@SneakyThrows はチェック例外を非チェック例外にして投げ直してくれる機能

projectlombok.org

チェック例外は try - catch で捕獲する必要がありコードが若干冗長になってしまう、そこで@SneakyThrowsを使うとチェック例外を非チェック例外のように扱えるのでコードがスッキリするメリットがある

例えば以下のようなコードが

  public String utf8ToString(byte[] bytes) {
    try {
      return new String(bytes, "UTF-8");
    } catch (UnsupportedEncodingException e) {
      throw new RuntimeException(e);
    }
  

次のように書ける

  @SneakyThrows
  public String utf8ToString(byte[] bytes) {
    return new String(bytes, "UTF-8");
  }

実際に生成されるソースコードは以下のように変換される

import lombok.Lombok;
...
  public String utf8ToString(byte[] bytes) {
    try {
      return new String(bytes, "UTF-8");
    } catch (UnsupportedEncodingException e) {
      throw Lombok.sneakyThrow(e);
    }
  }

この時、lombok.jarがクラスパスになければ動作しないように思えたのだが、以下の実装を見る限りバイトコード変換前にこの処理を取り除いて依存関係を排除しているみたい

github.com

つまり、lombok.jarはクラスパスに必要なさそうと理解した