読み込み中...

Javaで使うtoStringメソッドの完全ガイド12選

JavaのtoStringメソッドを使ったサンプルコードのイメージ Java
この記事は約23分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読めば、JavaのtoStringメソッドを完璧に使いこなすことができるようになります。

Javaプログラミングでよく遭遇する疑問や課題の一つが、オブジェクトのデータを人間が読みやすい形式、たとえば文字列で出力することです。

この問題を解決するための最もシンプルな方法が、Javaに組み込まれているtoStringメソッドです。

ただし、使い方を誤ると予想外の結果を招くことも。

そこで今回は、初心者から上級者までが確実に理解できるように、toStringメソッドの使い方、注意点、カスタマイズ方法などを徹底的に解説していきます。

●JavaのtoStringメソッドとは

○toStringメソッドの基本

toStringメソッドはJavaにおいて、オブジェクトを文字列として表現するためのメソッドです。

Javaの全てのクラスは、Objectクラスを暗黙のうちに継承しており、このObjectクラスにtoStringメソッドが定義されています。

よって、Javaで作成した任意のクラスオブジェクトに対して、toStringメソッドを呼び出すことができます。

例えば、ある学生クラスのオブジェクトがあり、そのオブジェクトの属性(名前、年齢、学年)を文字列として出力したいとき、toStringメソッドを使って独自に文字列形式を定義することができます。

○Javaオブジェクトと文字列変換の関係

オブジェクトを文字列に変換することがなぜ重要なのか。

それは、プログラミングにおいてデバッグ作業や、オブジェクトの状態を一目で確認する場面が多いからです。

特に、複雑なオブジェクトやリスト、マップなどを扱う場合、その内容をすぐに確認する手段としてtoStringメソッドは非常に便利です。

また、データベースとの連携や、ファイル出力、ログ出力などでも、オブジェクトの状態を文字列で表現することが一般的です。

●toStringメソッドの使い方

さて、ここからはtoStringメソッドの具体的な使い方について詳しく解説していきます。

初心者はもちろん、経験者もこの部分で新たな発見や理解の深まりを感じるでしょう。

○サンプルコード1:基本的なオブジェクトの文字列変換

最初に簡単な例から見ていきましょう。

下記のコードは、JavaのObjectクラスのインスタンスを作成し、そのtoStringメソッドを呼び出すものです。

// Objectクラスのインスタンスを作成
Object obj = new Object();

// toStringメソッドを呼び出し、結果を出力
System.out.println(obj.toString());

このコードを実行すると、出力結果はObjectクラスのハッシュコードを含むような形式になります。

たとえば、java.lang.Object@74a14482といった形です。

○サンプルコード2:カスタマイズした文字列変換

toStringメソッドはオーバーライド可能です。

自分自身で定義したクラスに対して、どのように文字列化するかを指定できます。

public class Student {
  private String name;
  private int age;

  public Student(String name, int age) {
    this.name = name;
    this.age = age;
  }

  // toStringメソッドをオーバーライド
  @Override
  public String toString() {
    return "Student{" +
           "name='" + name + '\'' +
           ", age=" + age +
           '}';
  }

  public static void main(String[] args) {
    Student student = new Student("Taro", 20);
    System.out.println(student.toString());
  }
}

このサンプルコードでは、StudentクラスにtoStringメソッドをオーバーライドしています。

この例では、名前と年齢を含む文字列が生成されます。

実行すると、Student{name='Taro', age=20}という形式の文字列が出力されます。

○サンプルコード3:独自のクラスでのtoStringメソッドのオーバーライド

独自のクラスが既存のクラスを継承している場合も、toStringメソッドをオーバーライドできます。

public class CollegeStudent extends Student {
  private String major;

  public CollegeStudent(String name, int age, String major) {
    super(name, age);
    this.major = major;
  }

  // toStringメソッドをオーバーライド
  @Override
  public String toString() {
    return super.toString() + ", major='" + major + '\'' ;
  }

  public static void main(String[] args) {
    CollegeStudent collegeStudent = new CollegeStudent("Taro", 20, "Engineering");
    System.out.println(collegeStudent.toString());
  }
}

このコードでは、Studentクラスを継承したCollegeStudentクラスを定義しています。

このクラスでもtoStringメソッドをオーバーライドして、専攻(major)も出力できるようにしています。

このコードを実行すると、Student{name='Taro', age=20}, major='Engineering'という出力結果が得られます。

●toStringメソッドの応用例

前節では、基本的な使い方やオーバーライド方法について詳しく解説しました。

ここでは、toStringメソッドの応用例について、さまざまなシチュエーションでどのように活用できるのかを、サンプルコードと共に解説します。

○サンプルコード4:リストの要素を一つの文字列にまとめる

Javaでよく使われるデータ構造の一つがリストです。リスト内の各要素を一つの文字列としてまとめたい場合、toStringメソッドが役立ちます。

import java.util.Arrays;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    // リストを作成
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

    // リストの要素を一つの文字列にまとめる
    String result = numbers.toString();

    // 結果を出力
    System.out.println(result);
  }
}

このコードを実行すると、出力結果は[1, 2, 3, 4, 5]となります。

ListインターフェースにはデフォルトでtoStringメソッドがオーバーライドされており、リストの要素が括弧[]で囲まれた形で出力されます。

○サンプルコード5:日付オブジェクトを独自のフォーマットの文字列に変換

次に、日付の扱いについてもtoStringメソッドでカスタマイズが可能です。

import java.text.SimpleDateFormat;
import java.util.Date;

public class CustomDate {
  private Date date;

  public CustomDate(Date date) {
    this.date = date;
  }

  // toStringメソッドをオーバーライド
  @Override
  public String toString() {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
    return sdf.format(date);
  }

  public static void main(String[] args) {
    CustomDate customDate = new CustomDate(new Date());
    System.out.println(customDate.toString());
  }
}

このコードにおいては、java.util.Dateクラスのオブジェクトを独自の形式の文字列に変換しています。

SimpleDateFormatを使用して、日付をyyyy/MM/dd形式に整形しています。

このコードを実行すると、例えば2023/09/25のような形で現在の日付が出力されます。

○サンプルコード6:複数のオブジェクト属性を一つの文字列に結合

Javaでクラスを定義する際、そのクラスが複数の属性(フィールド)を持つケースがよくあります。

このような場合、toStringメソッドを適切にオーバーライドすることで、複数の属性を一つの文字列にまとめることができます。

Personクラスにnameageの2つの属性があります。

その両方をtoStringメソッドで一つの文字列にまとめるサンプルコードを紹介します。

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // toStringメソッドをオーバーライド
    @Override
    public String toString() {
        // nameとageを結合して返す
        return "名前: " + name + ", 年齢: " + age;
    }

    public static void main(String[] args) {
        Person person = new Person("Taro", 25);
        System.out.println(person.toString());
    }
}

このコードの主要なポイントは、toStringメソッド内でnameageを結合しているところです。

文字列と数値型を結合する場合、Javaが自動で数値を文字列に変換してくれるので、明示的な変換は不要です。

このコードを実行すると、コンソールに名前: Taro, 年齢: 25という文字列が出力されます。

○サンプルコード7:条件に応じた動的な文字列変換

場合によっては、toStringメソッド内で条件分岐を行い、動的に文字列を生成することもあります。

下記のサンプルコードでは、Personクラスに新たにboolean型のフィールドisStudentを追加し、その値によって返す文字列を変えています。

public class Person {
    private String name;
    private int age;
    private boolean isStudent;

    public Person(String name, int age, boolean isStudent) {
        this.name = name;
        this.age = age;
        this.isStudent = isStudent;
    }

    // toStringメソッドをオーバーライド
    @Override
    public String toString() {
        if (isStudent) {
            return "名前: " + name + ", 年齢: " + age + ", 学生: はい";
        } else {
            return "名前: " + name + ", 年齢: " + age + ", 学生: いいえ";
        }
    }

    public static void main(String[] args) {
        Person student = new Person("Taro", 25, true);
        Person nonStudent = new Person("Hanako", 30, false);
        System.out.println(student.toString());
        System.out.println(nonStudent.toString());
    }
}

このコードを実行すると、isStudenttrueの場合は名前: Taro, 年齢: 25, 学生: はいfalseの場合は名前: Hanako, 年齢: 30, 学生: いいえとそれぞれ出力されます。

○サンプルコード8:外部ライブラリを利用した高度な文字列変換

プロジェクトが大きくなると、複雑なオブジェクト構造を持つクラスが増えます。

そのような場合には、Javaの標準ライブラリだけでなく、外部ライブラリを利用してtoStringメソッドを高度にカスタマイズすることもあります。

今回は、Apache Commons LangというライブラリのToStringBuilderクラスを使用して、オブジェクトの属性を高度に整形する方法を解説します。

まず、次のようにMavenプロジェクトのpom.xmlに依存性を追加してください。

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>
</dependencies>

次に、次のサンプルコードを参照してください。

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public class AdvancedPerson {
    private String name;
    private int age;
    private boolean isStudent;

    public AdvancedPerson(String name, int age, boolean isStudent) {
        this.name = name;
        this.age = age;
        this.isStudent = isStudent;
    }

    // toStringメソッドをオーバーライド
    @Override
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
            .append("名前", name)
            .append("年齢", age)
            .append("学生かどうか", isStudent)
            .toString();
    }

    public static void main(String[] args) {
        AdvancedPerson person = new AdvancedPerson("Taro", 25, true);
        System.out.println(person.toString());
    }
}

このコードでは、ToStringBuilderクラスを使ってnameageisStudentの三つの属性を整形しています。

ToStringStyle.MULTI_LINE_STYLEを設定することで、各属性が多行にわたって表示されるようにしています。

このコードを実行すると、次のような出力がされます。

AdvancedPerson@abcdef[
  名前=Taro,
  年齢=25,
  学生かどうか=true
]

この出力結果から分かるように、ToStringBuilderを用いることで、複数の属性を整形したり、読みやすい多行の形式で出力することが可能です。

Apache Commons Langライブラリは豊富なカスタマイズオプションを提供しており、プロジェクトのニーズに応じて高度な文字列変換が行えます。

●注意点と対処法

toStringメソッドを使用する際には、いくつかの注意点が存在します。

これらの注意点を理解しておくことで、より効率的かつ安全なコードを書くことが可能です。

○null値を持つオブジェクトの取り扱い

Javaではnull値を持つオブジェクトに対してtoStringメソッドを呼び出すと、NullPointerExceptionが発生します。

この問題を回避する一つの方法は、nullチェックを行うことです。

public class NullHandling {
    public static void main(String[] args) {
        String str = null;
        String result = (str == null) ? "null" : str.toString();
        System.out.println("結果:" + result);
    }
}

このコードは、strがnullかどうかをチェックしています。

nullであれば、”null”という文字列を出力し、そうでなければtoStringメソッドを実行します。

実行すると、コンソールに「結果:null」と表示されます。

○パフォーマンス上の考慮事項

大規模なオブジェクトやリストを扱う場合、toStringメソッドは非常に時間がかかる可能性があります。

そのような場合には、次のようなコードでパフォーマンスを改善することができます。

public class PerformanceExample {
    private String someLargeString;
    private List<String> someLargeList;

    @Override
    public String toString() {
        if (someLargeList.size() > 100) {
            return "Data is too large to print";
        }
        return "PerformanceExample [someLargeString=" + someLargeString + ", someLargeList=" + someLargeList + "]";
    }
}

このコードでは、リストのサイズが100を超えている場合には、”Data is too large to print”と出力されます。

○セキュリティ上の注意点

toStringメソッドは、デバッグ情報をログに出力する際などに使用されることが多いですが、これがセキュリティリスクになることがあります。

例えば、機密情報が含まれるフィールドをtoStringメソッドで出力してしまうと、その情報が漏洩する可能性があります。

public class SecurityRisk {
    private String username;
    private String password;

    @Override
    public String toString() {
        return "Username: " + username + ", Password: [REDACTED]";
    }
}

上記のコードでは、passwordフィールドの内容は[REDACTED]として隠蔽されています。

●カスタマイズ方法

JavaのtoStringメソッドは多くの場合で役立つものですが、場合によってはその挙動をカスタマイズしたいと思うことがあります。

それでは、そのようなカスタマイズ方法について解説します。

○サンプルコード9:toStringメソッドの挙動をカスタマイズする

基本的なオブジェクトの属性を文字列として出力するだけでなく、特定のフォーマットに従って出力する方法もあります。

例えば、次のようにJSON形式でオブジェクトの内容を出力するカスタマイズが考えられます。

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "{\"name\": \"" + name + "\", \"age\": " + age + "}";
    }

    public static void main(String[] args) {
        Person person = new Person("Taro", 30);
        System.out.println(person);
    }
}

このコードでは、PersonクラスのtoStringメソッドをオーバーライドして、そのインスタンスの属性をJSON形式で出力するようにしています。

このコードを実行すると、{"name": "Taro", "age": 30}という文字列がコンソールに出力されます。

○サンプルコード10:外部ライブラリを使用したカスタマイズ

外部ライブラリを使用することで、更に高度なカスタマイズも可能です。

例として、GoogleのGsonライブラリを使って、JavaオブジェクトをJSON形式の文字列に変換する方法を紹介します。

まず、Gsonライブラリをプロジェクトに追加する必要があります。

import com.google.gson.Gson;

public class PersonWithGson {
    private String name;
    private int age;

    public PersonWithGson(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        PersonWithGson person = new PersonWithGson("Taro", 30);
        Gson gson = new Gson();
        String json = gson.toJson(person);
        System.out.println(json);
    }
}

このコードは、Gsonライブラリを使用してPersonWithGsonクラスのインスタンスをJSON形式の文字列に変換しています。

この方法を用いれば、toStringメソッドの中でわざわざJSON形式の文字列を手作業で生成する必要がありません。

このコードを実行すると、{"name":"Taro","age":30}という形式のJSON文字列がコンソールに出力されます。

○サンプルコード11:toStringメソッドの拡張利用例

toStringメソッドを使って、オブジェクトの状態をデバッグやロギングに用いるケースが多いです。

しかし、このメソッドを用いてオブジェクト間の比較やソートに使うといった応用例も考えられます。

下記の例では、PersonクラスのオブジェクトをtoStringメソッドの結果を用いて比較しています。

import java.util.Arrays;

public class Person implements Comparable<Person> {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + "-" + age;
    }

    @Override
    public int compareTo(Person o) {
        return this.toString().compareTo(o.toString());
    }

    public static void main(String[] args) {
        Person[] persons = {
            new Person("Alice", 25),
            new Person("Bob", 20),
            new Person("Catherine", 22)
        };

        Arrays.sort(persons);

        for (Person person : persons) {
            System.out.println(person);
        }
    }
}

このJavaコードでは、PersonクラスがComparableインターフェースを実装しています。

compareToメソッド内でtoStringメソッドの結果を用いて比較を行っています。

mainメソッドでは、Personオブジェクトの配列をソートして出力しています。

このコードを実行すると、次のような出力が得られます。

Alice-25
Bob-20
Catherine-22

この出力結果からわかるように、PersonオブジェクトがtoStringメソッドの結果に基づいてアルファベット順にソートされています。

○サンプルコード12:複数のオブジェクトとの組み合わせでのカスタマイズ

最後に、toStringメソッドを用いて複数のオブジェクトを一つの文字列にまとめる応用例を紹介します。

public class Team {
    private Person[] members;

    public Team(Person[] members) {
        this.members = members;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("Team members: ");

        for (int i = 0; i < members.length; i++) {
            sb.append(members[i].toString());
            if (i < members.length - 1) {
                sb.append(", ");
            }
        }

        return sb.toString();
    }

    public static void main(String[] args) {
        Person[] persons = {
            new Person("Alice", 25),
            new Person("Bob", 20),
            new Person("Catherine", 22)
        };
        Team team = new Team(persons);
        System.out.println(team);
    }
}

この例では、TeamクラスのtoStringメソッドを用いて、そのチームに所属するPersonオブジェクト全体を一つの文字列としてまとめて出力しています。

このコードを実行すると、次のような結果が得られます。

Team members: Alice-25, Bob-20, Catherine-22

こちらの出力結果から、Teamオブジェクトが所持する複数のPersonオブジェクトが一つの文字列にまとめられて出力されていることがわかります。

まとめ

JavaのtoStringメソッドはオブジェクトを文字列形式で表現するための重要なメソッドです。

この記事では、その基本的な使い方から応用例、カスタマイズ方法に至るまで、幅広く解説しました。

この記事が、toStringメソッドをより深く理解し、多様なシナリオで活用する一助となれば幸いです。