5

すべての POJO がオーバーライドtoString()から継承されている必要があるプロジェクトを開発しています。Object class

以下の不変クラスを検討してください。

public final class SomeActivity {
    private final int id;
    private final String name;
    private final String description;
    private final DateTime startDate;
    private final DateTime endDate;
    private final String note;

    // Constructors and getters

    // My future implementation of toString
}

オーバーライドするときの私の目的toString()は、以下の出力と同様のものを達成して出力することです(すべてのSomeActivityクラスフィールドのテスト値を使用):

[Id: 1, Name: Read a book, Description: Trying to discover how to build a plane, StartDate: 17/10/2013, EndDate: 15/11/2013, Note: I really need this]

したがって、私は2つの解決策を念頭に置いています。

1 - 文字列の連結

私の知る限りString、不変クラスです。( javadocを参照してください)、そのため、このような出力を受け取るメソッドを実装すると、連結のために多くのオブジェクトが作成される可能性があります。

@Override
public String toString() {
    String s = "[Id: " + id + 
            ", Name: " + name + 
            ", Description: " + description + 
            ", StartDate: " + startDate + 
            ", EndDate: " + endDate + 
            ", Note: " + note + 
            "]";
}

2 - StringBuilder の使用

アプローチを使用StringBuilderすると、理論的には、「連結アプローチ」の代わりにインスタンス化されるオブジェクトが少なくなります。ただし、以下のコードの通知new StringBuilderと呼び出し:toString()

@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
        builder.append("[Id: ").append(id)
                .append(", Name: ").append(name)
                .append(", Description: ").append(description)
                .append(", StartDate: ").append(startDate)
                .append(", EndDate: ").append(endDate)
                .append(", Note: ").append(note)
                .append("]");

        return builder.toString();
}

この 2 番目の選択肢は、本当に可能な限り最良の方法ですか? または、私が採用すべき別のアプローチはありますか?toStringこれらのメソッドがloopステートメントから呼び出されていると考えてください。

残念ながら、私はメモリ テストにあまり詳しくないので、そのためのテストを書くことができれば、それについて知りたいと思います。

前もって感謝します。

4

2 に答える 2

8

私の知る限り、String は不変クラスです。(javadoc を参照) したがって、このような出力を受け取るメソッドを実装すると、連結のために多くのオブジェクトが作成される可能性があります。

いいえ。単一の大きな式ですべての連結を実行しているため、コンパイラはほぼStringBuilder同等のコードを作成します。

ただし、以下のコードの新しい StringBuilder および toString() 呼び出しに注意してください。

ええと、そうです - そして?toStringさまざまな異なるフィールド値を使用するが、文字列を作成しないメソッドを作成するのは珍しいことです。

ここにはメモリリークはありません。はい、StringBuilderandを作成しStringますが、それらは適切にガベージ コレクションされます。

これらの形式のいずれか、またはString.formatおそらく、最も読みやすいと思われるものを自由に使用してください。最初のフォームを使用する場合は、1 行に 1 つの説明と 1 つのフィールド値が含まれるように再フォーマットします。

return "["
    + "Id: " + id 
    + ", Name: " + name 
    + ", Description: " + description
    + ", StartDate: " + startDate 
    + ", EndDate: " + endDate 
    + ", Note: " + note
    + "]";

この時点では、読みやすさとフィールドの追加/削除の容易さの点で、2 番目の形式に似ています。

于 2013-10-17T15:09:42.507 に答える