JavaでtoStringメソッドを使用する方法


118

クラスtoString()で定義されているメソッドの概念を誰かに説明できますObjectか?それはどのように使用され、その目的は何ですか?



ここにも簡単なトリック/クイック実装があります:@Override public String toString(){return org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString(this); }
granadaCoder

回答:


81

Object.toStringドキュメントから:

オブジェクトの文字列表現を返します。一般に、toString メソッドはこのオブジェクトを「テキストで表す」文字列を返します。結果は、簡潔でありながら有益な表現で、人が読みやすいものでなければなりません。すべてのサブクラスがこのメソッドをオーバーライドすることをお勧めします。

toStringclass のメソッドはObject 、オブジェクトがインスタンスであるクラスの名前、アットマーク文字 `@ '、およびオブジェクトのハッシュコードの符号なし16進表記で構成される文字列を返します。つまり、このメソッドは次の値に等しい文字列を返します。

getClass().getName() + '@' + Integer.toHexString(hashCode())

例:

String[] mystr ={"a","b","c"};
System.out.println("mystr.toString: " + mystr.toString());

output:- mystr.toString: [Ljava.lang.String;@13aaa14a

1
主な目的は、サブクラスでそれをオーバーライドすることです。@stephenとAndreas_Dからの回答は、受け入れられた回答よりも優れていると思います。
スリーラマ2017

39

の使用String.toString

Stringフォームでvalueというコンストラクタを調べる必要があるときはいつでも、単純にString.toString...例を使用できます...

package pack1;

import java.util.*;

class Bank {

    String n;
    String add;
    int an;
    int bal;
    int dep;

    public Bank(String n, String add, int an, int bal) {

        this.add = add;
        this.bal = bal;
        this.an = an;
        this.n = n;

    }

    public String toString() {
        return "Name of the customer.:" + this.n + ",, "
                + "Address of the customer.:" + this.add + ",, " + "A/c no..:"
                + this.an + ",, " + "Balance in A/c..:" + this.bal;
    }
}

public class Demo2 {

    public static void main(String[] args) {

        List<Bank> l = new LinkedList<Bank>();

        Bank b1 = new Bank("naseem1", "Darbhanga,bihar", 123, 1000);
        Bank b2 = new Bank("naseem2", "patna,bihar", 124, 1500);
        Bank b3 = new Bank("naseem3", "madhubani,bihar", 125, 1600);
        Bank b4 = new Bank("naseem4", "samastipur,bihar", 126, 1700);
        Bank b5 = new Bank("naseem5", "muzafferpur,bihar", 127, 1800);
        l.add(b1);
        l.add(b2);
        l.add(b3);
        l.add(b4);
        l.add(b5);
        Iterator<Bank> i = l.iterator();
        while (i.hasNext()) {
            System.out.println(i.next());
        }
    }

}

...このプログラムをEclipseにコピーして実行してください...についてのアイデアが得られString.toStringます...


5
toStringUIの目的には適さず、適切ではないことをご理解いただければ幸いです。
Powerslave 2014年

@Powerslaveは、すべてのSwingコンポーネントがtoStringGUIでオブジェクトを表示するために使用している理由を説明していますか?リッチオブジェクトがあり、それをGUIに表示したい場合、いいえ、そのための追加のレンダラーを作成したり、オブジェクトから文字列プロパティを抽出してGUIでそれを使用したりしません。シンプルで実装toStringして、そのすべてのオーバーヘッドを回避できるようにします。これをよりクリーンな方法で行う場合は、UI専用のラッパークラスを作成し、そのtoStringメソッドを実装してラッパーの文字列プロパティを返します。
Timmos、2015

1
@Timmos友達が橋から飛び降りたら、フォローしますか?Swing開発者が(読み取り、乱用)を使用しているからといって、toString関数を使用する必要はありません。
Toby Caulk 2017

2
デフォルトのSwing APIを使い続けることを考えると、これは、ジョブを完了するための最も簡単なアプローチです。カスタムレンダリングが必要な場合は、コンポーネントにカスタムレンダラーをインストールしてください。Stringで表されたオブジェクトを表示したいだけの場合、toString()の実装は、カスタムレンダラーに比べてはるかに簡単です。橋から飛び降りるのとの違いはおかしいと思います。
Timmos 2017

35

このtoString()メソッドは、オブジェクトのテキスト表現を返します。基本的な実装は既に含まれjava.lang.Objectているため、すべてのオブジェクトがjava.lang.Objectそれを継承するため、Javaのすべてのオブジェクトがこのメソッドを持つことが保証されます。

デバッガーはtoString()メソッドの結果によってオブジェクトを表示することが多いため、特にデバッグに関しては、メソッドをオーバーライドすることは常に良い考えです。したがって、意味のある実装を使用しますが、技術的な目的で使用してください。アプリケーションロジックはゲッターを使用する必要があります。

public class Contact {
  private String firstName;
  private String lastName;
  public Contact (String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  public String getFirstName() {return firstName;}
  public String getLastName() {return lastName;}

  public String getContact() {
    return firstName + " " + lastName;
  }

  @Override
  public String toString() {
    return "["+getContact()+"]";
  }
}

14

オプションでアプリケーションのコンテキスト内で使用できますが、はるかに多くの場合、デバッグ目的で使用されます。たとえば、IDEでブレークポイントにtoString()到達すると、メンバーを検査するよりも、意味のあるオブジェクトを読み取る方がはるかに簡単です。

toString()メソッドが何をすべきかについては、一定の要件はありません。慣例により、ほとんどの場合、クラスの名前と関連するデータメンバーの値がわかります。多くの場合、toString()メソッドはIDEで自動生成されます。

toString()メソッドからの特定の出力に依存したり、プログラム内でそれを解析することは悪い考えです。何をするにしても、その道を進んではいけません。


2
最後のステートメントについて詳しく教えていただけますか?
Jean-Philippe Caruana、

13

toString()は、オブジェクトの文字列/テキスト表現を返します。一般に、デバッグ、ロギングなどの診断目的で使用されます。toString()メソッドは、オブジェクトに関する意味のある詳細を読み取るために使用されます。

オブジェクトがprintln、print、printf、String.format()、assert、または文字列連結演算子に渡されると、自動的に呼び出されます。

クラスObjectのtoString()のデフォルト実装は、このオブジェクトのクラス名と、それに続く@記号、および次のロジックを使用したこのオブジェクトのハッシュコードの符号なし16進表記で構成される文字列を返します。

getClass().getName() + "@" + Integer.toHexString(hashCode())

たとえば、次の

public final class Coordinates {

    private final double x;
    private final double y;

    public Coordinates(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public static void main(String[] args) {
        Coordinates coordinates = new Coordinates(1, 2);
        System.out.println("Bourne's current location - " + coordinates);
    }
}

プリント

Bourne's current location - Coordinates@addbf1 //concise, but not really useful to the reader

次に、CoordinatesクラスのtoString()を次のようにオーバーライドします。

@Override
public String toString() {
    return "(" + x + ", " + y + ")";
}

結果は

Bourne's current location - (1.0, 2.0) //concise and informative

これらのオブジェクトへの参照を含むコレクションでメソッドが呼び出されると、toString()をオーバーライドすることの有用性がさらに高まります。たとえば、次の

public static void main(String[] args) {
    Coordinates bourneLocation = new Coordinates(90, 0);
    Coordinates bondLocation = new Coordinates(45, 90);
    Map<String, Coordinates> locations = new HashMap<String, Coordinates>();
    locations.put("Jason Bourne", bourneLocation);
    locations.put("James Bond", bondLocation);
    System.out.println(locations);
}

プリント

{James Bond=(45.0, 90.0), Jason Bourne=(90.0, 0.0)}

これの代わりに、

{James Bond=Coordinates@addbf1, Jason Bourne=Coordinates@42e816}

いくつかの実装ポインタ、

  1. ほとんどの場合、toString()メソッドをオーバーライドする必要があります。オーバーライドが不要なケースの1つは、java.util.Mathの方法で静的ユーティリティメソッドをグループ化するユーティリティクラスです。オーバーライドが不要な場合はかなり直感的です。ほとんどいつもあなたは知っているでしょう。
  2. 返される文字列は、簡潔で有益なものである必要があります。
  3. 少なくとも、2つの異なるオブジェクト間の同等性を確立するために使用されるフィールド、つまり、equals()メソッドの実装で使用されるフィールドは、toString()メソッドによって吐き出される必要があります。
  4. 返される文字列に含まれるすべてのインスタンスフィールドにアクセサ/ゲッターを提供します。たとえば、Coordinatesクラスでは、

    public double getX() {
        return x;
    }
    public double getY() {
        return y;
    }

toString()メソッドの包括的な説明は、Josh Bloch著の本、Effective Java™、Second EditionのItem 10にあります。


6

コーディング:

public class Test {

    public static void main(String args[]) {

        ArrayList<Student> a = new ArrayList<Student>();
        a.add(new Student("Steve", 12, "Daniel"));
        a.add(new Student("Sachin", 10, "Tendulkar"));

        System.out.println(a);

        display(a);

    }

    static void display(ArrayList<Student> stu) {

        stu.add(new Student("Yuvi", 12, "Bhajji"));

        System.out.println(stu);

    }

}

Student.java:

public class Student {

    public String name;

    public int id;

    public String email;

    Student() {

    }

    Student(String name, int id, String email) {

        this.name = name;
        this.id = id;
        this.email = email;

    }

     public String toString(){           //using these toString to avoid the output like this [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]
          return name+" "+id+" "+email;     
         }  


    public String getName(){

        return name;
    }

    public void setName(String name){

        this.name=name;
    }

    public int getId(){

        return id;
    }

    public void setId(int id){

        this.id=id;
    }

    public String getEmail(){

        return email;

    }

    public void setEmail(String email){

        this.email=email;
    }
}

出力:

[スティーブ12ダニエル、サチン10テンダルカー]

[スティーブ12ダニエル、サチン10テンドゥルカル、ユビ12バウジ]

Pojo(Student.java)クラスでtoString()を使用していない場合、のような出力が得られます[com.steve.test.Student@6e1408, com.steve.test.Student@e53108]。この種の問題を回避するために、toString()メソッドを使用しています。


4

StringコンテキストでObject(Stringではない)にアクセスすると、コンパイラによって内部でtoString()が呼び出されます。

これが理由です

Map map = new HashMap();
System.out.println("map=" + map);

動作し、独自のクラスのObjectから標準のtoString()をオーバーライドすることにより、オブジェクトをStringコンテキストでも使用できるようにすることができます。

(そして、それをブラックボックスと見なしてください。決して、コンテンツを人間に提示する以外の目的で使用しないでください)


3

正しくオーバーライドされたtoStringメソッドは、Javaのロギングとデバッグに役立ちます。


2

cletusがデバッグに関して回答したものとは別に、使用するときなど、オブジェクトを出力するときはいつでも使用されます

 System.out.println(myObject);

または

System.out.println("text " + myObject);

1

toStringの主な目的は、オブジェクトのString表現を生成することです。つまり、戻り値は常にStringです。ほとんどの場合、これは単にオブジェクトのクラスとパッケージ名ですが、StringBuilderのような場合には、実際にはString-textになります。


0
/**
 * This toString-Method works for every Class, where you want to display all the fields and its values
 */
public String toString() {

    StringBuffer sb = new StringBuffer();

    Field[] fields = getClass().getDeclaredFields(); //Get all fields incl. private ones

    for (Field field : fields){

        try {

            field.setAccessible(true);
            String key=field.getName();
            String value;

            try{
                value = (String) field.get(this);
            } catch (ClassCastException e){
                value="";
            }

            sb.append(key).append(": ").append(value).append("\n");

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    return sb.toString();
}

0

最初にPython、次にJavaを学ぶ場合。私はそれは同じ役割を果たすと考える__str__()ことがあり、Pythonでメソッドを魔法の方法のように__dict__()して__init__()そのオブジェクトを表す文字列を参照すること。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.