Lombok でできること確認します。( @ToString )

2021年5月6日

先日の投稿の続きとなります。 Lombok の機能を見ていこうと思います。
今回は @ToString です。

オブジェクトを文字列で表現する。

オブジェクトを出力する?

この実装で出力したとき、いったい何が出力されるでしょうか?

package com.example.demo;

public class HogeLombok {
	private int age;
	private String name;
	private String hobby;
	
}

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
		
		HogeLombok v = new HogeLombok();
		System.out.println(v);
	}
}

 

正解は・・・

出力結果

なにやら妙な文字列が出力されましたね。
というか例外にはならないのですね!
実はJavaではSystem.out.printlnの引数にオブジェクトを渡すとそのクラスのtoString()メソッドを呼び出す仕様となっているのです。
「toString()なんて実装してないけど?」とお思いかもしれません。
toStringメソッドはすべての親であるObjectクラスが持つメソッドなのです。

何が出力される?

toStringメソッドを何も考えないで呼び出すとオブジェクトの固有情報を文字列として返します。
先ほどの出力結果がコレが出力されているのです。

@より前はオブジェクトのクラス、@より後ろの文字列はオブジェクトの住所のような情報となっています。
この情報は時として有用ですができればもっと具体的な値を出力したいものです。
例えば今回の例でいうとageの値には何が入っているのか?などですね。

自分で実装してみる

では自分でtoStringメソッドを実装(オーバーライド)してみましょう。

package com.example.demo;

public class HogeLombok {
	private int age;
	private String name;
	private String hobby;
	
	@Override
	public String toString() {
		return "ageは" + age + ",nameは" + name + ",hobbyは" + hobby;
	}
}

こんな感じで実装してみました。
修正箇所かここだけです。
実行してみましょう。

出力結果

このような感じで出力されます。
今回はオブジェクトに値を設定していないので初期値が出力されました。

この例では3つのメンバ変数だったので簡単でしたがこれが10,20となると記述も大変ですし
実装ミスを誘発してしまう可能性もありますよね。

 

@ToStringを使用する

LombokにはtoStringの実装をとても楽にしてくれる機能があります。
それが @ToString アノテーションです。

使い方

使い方はとても簡単です。
クラス定義の上に @ToString アノテーションを実装するだけ(importを忘れずに)。

package com.example.demo;

import lombok.ToString;

@ToString
public class HogeLombok {
	private int age;
	private String name;
	private String hobby;
	
//	@Override
//	public String toString() {
//		return "ageは" + age + ",nameは" + name + ",hobbyは" + hobby;
//	}
}

確認

それでは @ToString の機能を確認してみましょう。

@ToStringでの出力結果

自身で実装するよりも見栄えがいいですね(笑
これならメンバ変数が増えても大丈夫ですよね。

でも出力したくない項目もあるかと思います。
例えばパスワードとか!?(そもそも保持すること自体危険なことかもしれません)

そういう時はexclude属性でtoStringで出力したくないメンバ名を指定しておきます。

package com.example.demo;

import lombok.ToString;

@ToString(exclude="password")
public class HogeLombok {
	private int age;
	private String name;
	private String hobby;
	private String password; // 出力したらダメ!
}

そうすると出力対象にならないので

@ToStringの出力結果

上記のようにpasswordは出力されなくなります。

 

まとめ

いかがだったでしょうか。Lombok の @ToString を用いると簡単かつシンプルな実装ができることを
理解していただけたのではないでしょうか。今回はここまで!