web-dev-qa-db-ja.com

toString実装に最適な標準スタイルは何ですか?

オブジェクトの属性を出力するために単純なtoStringを実装したいオブジェクトがたくさんあります。これらの属性の一部は、それ自体が複雑なオブジェクトである可能性があります。

スタイルの標準、または単にベストプラクティスはありますか?私は次のようなことを考えています:

[SimpleClassName] { prop1:value, prop2:value }

この場合、ネストされた値は次のようになります。

[SimpleClassName] { prop1:value, prop2:[NestedObject] { prop3:value}}

Javaを使用していますが、ほとんどの言語で同じ質問をしていることに気づきました。

37
Nicole

個人的には、[]{}を組み合わせると、階層をすぐに確認するのは簡単ではありません。

私はこのフォーマットが好きです(そして私はそれが多くの場所で使われているのを見てきました):

SimpleClassName[prop1=value, prop2=value]
SimpleClassName[prop1=value, prop2=NestedObject[prop3=value]]

@で識別子を追加する可能性もあります。たとえば、 デフォルトのスタイル for commons-langToStringBuilderはそれを行います(独自の例):

Person@182f0db[name=John Doe,age=33,smoker=false]
26

Guava 's MoreObjects.toStringHelper() によって生成された形式はかなりいいと思いますが、主に、一貫した形式を使用するのは良いことです。

public String toString() {
  return Objects.toStringHelper(this)
      .add("prop1", prop1)
      .add("prop2", prop2)
      .toString();
}

// Produces "SimpleClassName{prop1=foo, prop2=bar}"
31
ColinD

json構文は、複雑なオブジェクトを文字列として表すように特別に設計されているため、かなりうまく適合しているようです。

Person = {
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "address": 
    {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": "10021"
    },
    "phoneNumber": 
    [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567"
        }
    ]
}
4
Brad Mace

質問に対する直接の答えではありませんが、以下は初期開発中の時間の節約になります。

免責事項:ApacheCommonsライブラリが使用されます。

  1. Java > Editor > Templatesxreflectという新しいEclipseテンプレートを追加します。以下をそのpattern textareaに追加します。
// ---------- template start ----------- //
${:import(org.Apache.commons.lang.builder.EqualsBuilder,org.Apache.commons.lang.builder.HashCodeBuilder,org.Apache.commons.lang.builder.ReflectionToStringBuilder)}
/*
 * (non-Javadoc)
* @see Java.lang.Object#equals(Java.lang.Object)
 */
@Override
public boolean equals(
        final Object pObj) {
    return EqualsBuilder.reflectionEquals(this, pObj);
}

/*
 * (non-Javadoc)
 * @see Java.lang.Object#toString()
 */
@Override
public String toString() {
    return ReflectionToStringBuilder.toString(this);
}

/*
 * (non-Javadoc)
 * @see Java.lang.Object#hashCode()
 */
@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}
// ---------- template end ----------- //
  1. OKOKを与える
  2. Javaクラスの最後に移動し、xreflectと入力して、 CtrlSpace equals()、toString()、hashCode()メソッドを自動的に自動入力します。
3
KrishPrabakar

スタイルの標準、または単にベストプラクティスはありますか?

いいえ。toString()メソッドの「最良の」出力は、それを何に使用するかによって決まります。オブジェクトの状態を逆シリアル化できる形式でシリアル化するためですか?デバッグメッセージを作成するためですか?エンドユーザーに表示するオブジェクトをレンダリングするためですか?

デバッグ/ロギングtoString()メソッドの社内スタイルを開発したい場合は、それで問題ありません。しかし、これに対する要件がない限り、私は気にしません。 IMO、それは他の場所でよりよく使われることができる努力です。

2
Stephen C

他のオープンソースプロジェクトの目的について質問したので、jEditの実行方法は次のとおりです。これはWouterのプロジェクトと似ています。

BufferChanging[what=BUFFER_CHANGING,source=org.gjt.sp.jedit.EditPane[active,global]]
0
Brad Mace

オブジェクトに識別子として役立つ可能性のあるものがある場合は、2番目の例のようなものを実装します。

[SimpleClassName:id] { prop1:value, prop2:[NestedObject:id] { prop3:value }}

ここで、idは、そのオブジェクトが識別子であることが理にかなっているものです。つまり、正規のPersonオブジェクトの名前、データベースのオブジェクトの主キーなどです。

0
zigdon

phps print_r($ obj、true)をチェックするか、serialize()も機能する可能性がありますが、何が必要か正確にはわかりません。 jsonsは、特にjavascript環境でデータをインポートする場合は、クリーンなソリューションでもあります。

0
rthrwht