SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Java特有の冗長なコードを簡潔に記述する「Lombok」

  • X ポスト
  • このエントリーをはてなブックマークに追加

@ToString

 toString()メソッドは、オブジェクトの文字列表現です。

 Objectクラスに定義された実装は、「型とハッシュコード」を文字列として出力するようになっています。ただしログ出力やデバッグ時に、オブジェクトの状態等の把握を目的として利用する場合、下記のようにオーバーライドして人間が見やすい文字列表現にしたほうが便利です。

toStringメソッドの実装 Lombok未使用版
public class Point {
    private int x;
    private int y;
    public String toString() {
        return "Point(x=" + this.x + ", y=" + this.y + ")";
    }
}

 @ToStringアノテーションを使ったコードは下記のようになります。

toStringメソッドの実装 Lombok使用版
@ToString
public class Point {
    private int x;
    private int y;
}
@ToStringアノテーション属性の説明
属性 説明
callSuper 基底クラスの文字列表現を含めるかを指定する。省略時はfalse。
doNotUseGetters getterメソッドを利用せずに文字列表現を作成するかを指定する。省略時はfalse。
getterメソッドが存在しない場合にはこの属性の指定に限らずメンバ変数を直接参照する。
exclude 文字列表現に含めないメンバ変数を指定する。
この属性に指定されていないメンバ変数で文字列表現が作成される。
includeFieldNames フィールド名を文字列表現に含めるかを指定する。省略時はtrue。
of 文字列表現に含めるメンバ変数を明示的に指定する。

自明な型宣言

 次は型宣言を見てみましょう。Javaの変数宣言には型の記述が必要です。下記の例では、ArrayListのインスタンスを生成する際の型宣言が記載されていますが、同じような型宣言を2度記述する必要があり冗長です。

自明な型宣言の実装 Lombok未使用版
final List<String> list = new ArrayList<String>();
list.add("item1"); 

val

 Lombokでは、この自明な型宣言をvalで宣言することができます。

自明な型宣言の実装 Lombok使用版
val list = new ArrayList<String>(); 
list.add("item1");

 コーディング時には型を推測し変数の型が決定されていますので、その型の持つメソッドの呼び出しなどの自動補完機能も有効になっています。

 ただし、注意が必要な点が一点あります。上記のようにArrayListクラスを扱うlist変数の型は通常、インターフェースであるList型で扱いますが、ArrayList型になってしまいます。

例外

 次は例外のコードを見てみましょう。FileReaderが宣言例外FileNotFoundExceptionをスローさせる可能性があるため、通常はtry,catch句で囲うか、メソッドにthrows宣言を加える必要があります。このJavaの宣言例外の仕様は、例外処理を忘れずに記述できるというメリットもありますが、フレームワークなどでまとめて例外を扱うケースでは、煩わしさを感じるでしょう。

例外 Lombok未使用版
public void read() {
    try {
        FileReader in = new FileReader("data.txt");
        // 省略
    } catch (FileNotFoundException e) {
        // 例外発生時の処理
    }
}

@SneakyThrows

 @SneakyThrowsアノテーションをメソッドに付与すると、そのメソッドで発生する例外を非検査例外として扱うことができます。

自明な型宣言の実装 Lombok使用版
@SneakyThrows
public void read() {
    FileReader in = new FileReader("data.txt");
        // 省略
}

 @SneakyThrowsを付与した場合でも、try,catch節を記述すれば、例外のキャッチが可能です。ただし、@SneakyThrowsアノテーションが付与されたメソッドは、宣言例外をスローしないメソッドとして扱われるため、呼び出しもとでFileNotFoundExceptionなどの宣言例外をキャッチするコードはコンパイルエラーです。Exceptionなどの上位例外クラスでキャッチする必要があります。

呼び出しもとでの例外キャッチ
try {
    obj.read();
} catch (FileNotFoundException e) { //コンパイルエラー
    e.printStackTrace();
}
@SneakyThrowsアノテーション属性の説明
属性 説明
value 非宣言例外として扱うクラスを指定します。

次のページ
委譲

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

五座 淳一(株式会社DTS)(ゴザ ジュンイチ)

株式会社DTS 金融企画部所属。主に大規模・金融機関向けシステム開発のアーキテクト担当しています。ウォーターフォール型の開発に、CIなどアジャイル開発のプラクティスを取り入れ、開発プロセスの改善を試みています。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7274 2013/08/20 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング