覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Lombok - @UtilityClass

Lombokの@UtilityClass(lombok.experimental.UtilityClass)アノテーションの利用サンプルです。

Javaでユーティリティ用のクラスを作成する際には、一般的に以下のようなコードを記述する必要があります

  • クラスは継承されないようにfinalにする
  • インスタンス化される意味がないので、コンストラクタをprivateにする
  • staticメソッドのみを定義する

クラスに@UtilityClassアノテーションを付与することで上記のようなコードの記述を簡略化できます。

@UtilityClassは所属パッケージが"experimental"になっており、その名の通り実験的なアノテーションです。
そのため、今後Lombokのバージョンが上がった際などに仕様が変更される可能性もあると思われます。


■@UtilityClassを付与したクラス

import lombok.experimental.UtilityClass;

@UtilityClass
public class SomeUtils {

    public static void printData1(String s) {
        System.out.println(s);
    }

    static void printData2(String s) {
        System.out.println(s);
    }

    public void someFunction(String s) {
        printParam(s);
    }


    private void printParam(String s) {
        System.out.println(s);
    }
}

■実際に生成されるソースコード

クラスが以下の状態になっていることが分かります

  • クラスがfinalになっている
  • デフォルトコンストラクタがprivateになっている
  • メソッドが全てstaticになっている
public final class SomeUtils {
    public static void printData1(String s) {
        System.out.println(s);
    }

    static void printData2(String s) {
        System.out.println(s);
    }

    public static void someFunction(String s) {
        printParam(s);
    }

    private static void printParam(String s) {
        System.out.println(s);
    }

    private SomeUtils() {
        throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
    }
}



関連エントリ