21
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

アルス・ウェアーAdvent Calendar 2018

Day 11

toString()をオーバーライドして自身の情報を親切に伝える

Last updated at Posted at 2018-12-10

toString()とは

java.lang.Objectに実装されているメソッドで、すべてのクラスでオーバーライド可能なメソッドです。そのインスタンスの文字列表現を返すメソッドなのですが、特にオーバーライドしていない場合デフォルトメソッド(Objectクラスに実装されているtoString)が呼ばれます。

toString()をオーバーライドしていないことによる問題

以下のような構成でtoStringをオーバーライドせず、Objectクラスに実装されているtoStringでEmployeeインスタンスの文字列表現を返すとします。

Employee.java
package co.jp.arsware;

public class Employee {

	private String id;

	private String name;

	public Employee(String id, String name) {
		this.id = id;
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
Main.java
package co.jp.arsware;

public class Main {

    public static void main(String[] args) {

        Employee nagaoka = new Employee("001", "Nagaoka");
        System.out.println(nagaoka);
    }
}

結果は以下の通りです。

.txt
co.jp.arsware.Employee@15db9742

ここで期待するのは、idやnameにどんな値が設定されているのかがほとんどだと思うのですが、これではなんのことか分かりませんよね。基本的にObjectクラスのtoStringが返す結果にはそのクラスを利用するユーザーが見たい情報は存在しません。

toString()をオーバーライドして自身の情報を親切に伝える

次に、Employeeクラスに以下の通りtoStringをオーバーライドして、再度Mainメソッドを実行してみます。

Employee.java

省略

@Override
public String toString() {
	return "id=" + this.getId() + ", name=" + this.getName();
}

結果は以下の通りです。先ほどの出力に比べてより有用な情報が出力されていることがわかります。

.txt
id=001, name=Nagaoka

しかし、これはこれでtoStringのオーバーライド実装工数がかかります。そのため、LombokのToStringアノテーション等のような、ボイラープレートコードを自動生成してくれるライブラリを導入することで、冗長なコードを書くという工数を削減することができます。

教訓

優れたtoStringの実装を提供することでそのクラスが使いやすくなり、そのクラスを使っているシステムをデバッグしやすくなります。println、printf、文字列結合演算子(+)、assert等のメソッドにインスタンスが渡されたり、デバッガによりインスタンスが表示されたりすると、toStringが自動的に呼び出されます。つまり、toStringを自分では呼び出さないとしても、他の誰かが呼び出す可能性があります。例えば、そのインスタンスの内容をそのままログ出力するケース等がそれにあたるかと思います。そういったケースも考慮して、可能な限りtoStringはオーバーライドして自身の情報を親切に伝えることを意識すると良いかと思います。

参考

21
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?