@ToString
toString()メソッドは、オブジェクトの文字列表現です。
Objectクラスに定義された実装は、「型とハッシュコード」を文字列として出力するようになっています。ただしログ出力やデバッグ時に、オブジェクトの状態等の把握を目的として利用する場合、下記のようにオーバーライドして人間が見やすい文字列表現にしたほうが便利です。
public class Point { private int x; private int y; public String toString() { return "Point(x=" + this.x + ", y=" + this.y + ")"; } }
@ToStringアノテーションを使ったコードは下記のようになります。
@ToString public class Point { private int x; private int y; }
属性 | 説明 |
---|---|
callSuper | 基底クラスの文字列表現を含めるかを指定する。省略時はfalse。 |
doNotUseGetters |
getterメソッドを利用せずに文字列表現を作成するかを指定する。省略時はfalse。 getterメソッドが存在しない場合にはこの属性の指定に限らずメンバ変数を直接参照する。 |
exclude |
文字列表現に含めないメンバ変数を指定する。 この属性に指定されていないメンバ変数で文字列表現が作成される。 |
includeFieldNames | フィールド名を文字列表現に含めるかを指定する。省略時はtrue。 |
of | 文字列表現に含めるメンバ変数を明示的に指定する。 |
自明な型宣言
次は型宣言を見てみましょう。Javaの変数宣言には型の記述が必要です。下記の例では、ArrayListのインスタンスを生成する際の型宣言が記載されていますが、同じような型宣言を2度記述する必要があり冗長です。
final List<String> list = new ArrayList<String>(); list.add("item1");
val
Lombokでは、この自明な型宣言をvalで宣言することができます。
val list = new ArrayList<String>(); list.add("item1");
コーディング時には型を推測し変数の型が決定されていますので、その型の持つメソッドの呼び出しなどの自動補完機能も有効になっています。
ただし、注意が必要な点が一点あります。上記のようにArrayListクラスを扱うlist変数の型は通常、インターフェースであるList型で扱いますが、ArrayList型になってしまいます。
例外
次は例外のコードを見てみましょう。FileReaderが宣言例外FileNotFoundExceptionをスローさせる可能性があるため、通常はtry,catch句で囲うか、メソッドにthrows宣言を加える必要があります。このJavaの宣言例外の仕様は、例外処理を忘れずに記述できるというメリットもありますが、フレームワークなどでまとめて例外を扱うケースでは、煩わしさを感じるでしょう。
public void read() { try { FileReader in = new FileReader("data.txt"); // 省略 } catch (FileNotFoundException e) { // 例外発生時の処理 } }
@SneakyThrows
@SneakyThrowsアノテーションをメソッドに付与すると、そのメソッドで発生する例外を非検査例外として扱うことができます。
@SneakyThrows public void read() { FileReader in = new FileReader("data.txt"); // 省略 }
@SneakyThrowsを付与した場合でも、try,catch節を記述すれば、例外のキャッチが可能です。ただし、@SneakyThrowsアノテーションが付与されたメソッドは、宣言例外をスローしないメソッドとして扱われるため、呼び出しもとでFileNotFoundExceptionなどの宣言例外をキャッチするコードはコンパイルエラーです。Exceptionなどの上位例外クラスでキャッチする必要があります。
try { obj.read(); } catch (FileNotFoundException e) { //コンパイルエラー e.printStackTrace(); }
属性 | 説明 |
---|---|
value | 非宣言例外として扱うクラスを指定します。 |