1

簡単なフォームの質問。次のコードでは、文字列を連結するためのより良い方法があります(つまり、tmpErrorを追加するのではなく、新しい文字列と同じに設定できますか?)

public void validate () throws Exception {
    String tmpError = "";
    if(paramA == null) tmpError = tmpError + "paramA was not set";

    if(paramB == null) tmpError = tmpError + "paramB was not set";

    if(paramC == null) tmpError = tmpError + "paramC was not set";


    if(!tmpError.equalsIgnoreCase("")){
        tmpError = "error occured" + tmpError;
        throw new Exception(tmpError);
    }
}

前もって感謝します

4

8 に答える 8

4

を使用することにより、効率を簡単に向上させることができますStringBuilder

の不変の性質により、文字列連結に加算()演算子をString使用するたびに、新しいオブジェクトが割り当てられます(を使用する場合も同様です)。+StringString.concat()

StringBuilder内部文字配列を保持するため、連結操作はその配列で機能し、そのメソッドStringを呼び出すときに1つのオブジェクトのみが割り当てられます。toString()そのappend()メソッドを使用して文字列の最後にテキストを追加し、insert()オフセット0を使用してテキストを追加します。

ただし、読みやすさも考慮する必要があります。Dasblinkenlightは彼の答えで良い点を述べました。また、Anthonyがすでに指摘しているように、+=複合代入演算子を使用して読みやすさを向上させることもできます。

public void validate () throws Exception {
    StringBuilder tmpError = new StringBuilder();
    if(paramA == null) tmpError.append("paramA was not set");

    if(paramB == null) tmpError.append("paramB was not set");

    if(paramC == null) tmpError.append("paramC was not set");


    if(tmpError.length() > 0){
        tmpError.insert(0,"error occured");
        throw new Exception(tmpError.getString());
    }
}
于 2013-03-21T10:42:14.693 に答える
4

私は常にStringBuilderの使用をお勧めします

このようなもの:

public void validate() throws Exception {
    StringBuilder error = new StringBuilder();
    if(paramA == null)
        error.append("paramA was not set");

    if(paramB == null)
        error.append("paramB was not set");

    if(paramC == null)
        error.append("paramC was not set");


    if(error.length() > 0) {

        throw new Exception("error occured " + error.toString());
    }
}
于 2013-03-21T10:47:22.887 に答える
1

+=(加算/連結および代入)演算子を使用できます。

if(paramA == null) tmpError += "paramA was not set";
于 2013-03-21T10:42:02.023 に答える
1

3つのパラメータがすべて欠落していると、4つの文字列オブジェクトが作成されるため、これは効率的ではありません。StringBuilder単一のオブジェクトに追加する方がよいでしょう。

ただし、これはエラー報告コードであり、コードがプログラミングエラーを検出した場合にのみ実行されます。そのような状況では、そもそも効率が発生することは想定されていないため、効率はそれほど重要ではありません。理解しやすいと思うものは何でも使用してください。

于 2013-03-21T10:43:00.100 に答える
1

このようにしてください:

public void validate () throws Exception {
    String tmpError = "";
    if(paramA == null) tmpError += "paramA was not set";

    if(paramB == null) tmpError += "paramB was not set";

    if(paramC == null) tmpError += "paramC was not set";


    if(!tmpError.equalsIgnoreCase("")){
        tmpError = "error occured" + tmpError;
        throw new Exception(tmpError);
    }
}

または、StringBuilderXaviが指摘したようにを使用することもできますが、ある種のループ内にテキストを追加する場合にのみ意味があります。

于 2013-03-21T10:43:10.670 に答える
1

2つの文字列を連結する最も速い方法は、Stringクラスの連結関数です。

public void validate () throws Exception {
    String tmpError = "";

    if(paramA == null) tmpError = tmpError.concat("paramA was not set");
    if(paramB == null) tmpError = tmpError.concat("paramB was not set");
    if(paramC == null) tmpError = tmpError.concat("paramC was not set");
    if(!tmpError.equalsIgnoreCase("")){
        tmpError = "error occured".concat(tmpError);
        throw new Exception(tmpError);
    }
}
于 2013-03-21T10:50:48.093 に答える
1

上記のいずれかではなく、Guava 前提条件を使用することをお勧めします。次に、次のようなコードを記述できます。

import static com.google.common.base.Preconditions.*;
...
public void doSomething(String strA, String strB) {
  checkNotNull(strA, "strA is missing");
  checkArgument(strB.length() >= 6, "strB is too short");
  ...
}

チェックが失敗した場合、anExceptionがスローされます。元のソリューションほど簡潔ではないかもしれませんが、意図は意味的に明白です。

于 2013-03-21T11:23:46.803 に答える
0

私は以下のように何かをしますpublicvoidvalidate()throws Exception {

public void validate () throws Exception {
    String tmpError = "";
    if(paramA == null) tmpError += "paramA was not set";
    if(paramB == null) tmpError += "paramB was not set";
    if(paramC == null) tmpError += "paramC was not set";

    if(!(tmpError.trim()).equalsIgnoreCase("")){
        tmpError = "error occured" + tmpError;
        throw new Exception(tmpError);
    }
}

空をチェックする前に、変数を使用+=してトリミングしたことを確認してください。tmpError

StringBuilderこのシナリオでは多くのメモリが処理されていないため、ここではそれほど心配する必要はないと思います。

StringBuilderを主張している場合は、以下のようにすることができます

public void validate () throws Exception {
    StringBuilder sb = new StringBuilder();
    if(paramA == null) sb.append("paramA was not set");
    if(paramB == null) sb.append("paramB was not set");
    if(paramC == null) sb.append("paramC was not set");

    if(!(sb.toString().trim()).equalsIgnoreCase("")){
        sb.Insert(0,"error occured");
        throw new Exception(sp.toString());
    }
}
于 2013-03-21T10:44:42.783 に答える