5

私は時々これらの2種類のメソッドを作成するようです:

// return null on errors, and append errors to 2nd param, otherwise return result
String fetchSomething(String parameter, List<String> errorMessagesOut);

// return empty list or null on no errors, otherwise list of errors
List<String> verifySomething(String parameter);

そして、これらを呼び出すコードは、通常はApache CommonsStringutils.joinメソッドを使用して、適切な区切り文字(単純なコンマ、改行、HTMLタグなど)を使用してエラーリストに結合します。そして通常の場合、エラーはなく、リストは空になります。

それで、私はこれらの2つの質問について疑問に思い始めました:

  1. エラーメッセージ文字列をリストとして返すことに問題がありますか?もしそうなら、より良い代替案は何ですか?(例外ではありません。必要に応じて、これらのメソッドを呼び出すコードによってスローされます。)

  2. 空のままであると予想され、通常は空でないときにシーケンシャルイテレータアクセスのみを持つ必要があるリストのnew LinkedList()場合、またはnew ArrayList(0)それ以上ですか?new ArrayList()


編集:ユースケースの例:

List<String> verifyParameters(JSONObject params) {
    List<String> ret = new ArrayList<String>(0);

    if (!verifyKey(params.get("key"))) 
        ret.add("Invalid key: " + key);

    if (!verifyAccess(params.get("user"), params.get("pass"))) 
        ret.add("Authentication error");

   return ret;
}

..。

List<String> errors = verifyParameters(params);
if (!errors.isEmpty()) {

    connection.sendErrorListMessage(errors);
    logger.warn(StringUtils.join(errors, ", "));
    controlPanel.show("Errors: \n- " + StringUtils.join(errors, "\n- ") + '\n');
    throw new AbortException("invalid params); // or maybe return false/null;
}
// proceed with valid params

通常、エラーリストの処理にはこれらすべてが含まれるわけではありません。エラーリストは、表示方法に関係なく、人間が見ることを目的としたメッセージのリストであり、処理に関連しない/有用ではないという点を説明しようとしています。異なるエラー。

4

4 に答える 4

3

文字列にリストを使用しても問題ないと思います。特に渡されたものが新しい空のリスト以外のものではない場合は特に、Result少なくとも専用のクラスを作成して、このようにする傾向があります。fetchSomthingerrorMessagesOut

Result result = fetchSomething(String parameter);
if (result.hasErrors()) {
    List<String> errors = result.getErrors();
} else {
    String fetched = result.getValue();
}

次に、エラー文字列を処理するメソッドもこのクラスに配置して、次のようなことができるようにします。

String errorMessage = result.getErrorString();

これにより、エラー データとそのフォーマットが 1 つの Class 内にカプセル化されます。つまり、エラーがない場合は、Result インスタンスで内部的に List を作成する必要はありません。

上記のポイントは、主にコード設計に関するものです。プロファイリングを行わずにマイクロ最適化を試みたり、変更の結果と比較するベンチマークを用意しても意味がありません。

于 2013-03-04T16:37:55.113 に答える
1

エラーメッセージ文字列をリストとして返すことに問題がありますか?もしそうなら、より良い代替案は何ですか?

いいえ。リストで問題が解決する場合は、リストを使用しても問題はありません。

空のままであると予想され、通常は空でないときにシーケンシャルイテレータアクセスのみを持つ必要があるリストのnew LinkedList()場合、またはnew ArrayList(0)それ以上ですか?new ArrayList()

リストに保存される要素の数を把握し、その容量でリストをインスタンス化しても、パフォーマンスが大幅に向上することはありません。

各ArrayListインスタンスには容量があります。容量は、リスト内の要素を格納するために使用される配列のサイズです。常に少なくともリストサイズと同じ大きさです。要素がArrayListに追加されると、その容量は自動的に増加します。成長方針の詳細は、要素の追加には一定の償却時間コストがあるという事実を超えて指定されていません。

ただし、リストのサイズが初期容量が指定されnew ArrayList(0)ていないときに初期化されるため、リストがほとんどの場合空である場合は、メモリを節約できます。10

于 2013-03-04T16:39:15.623 に答える
1

これらのエラーは何のためですか? メソッドによって返されたエラーからビジネス上の決定を下す予定はありますか? それ以外の場合、エラーが単にログに記録するためのものである場合、単純なログ ソリューションでは、エラーが発生するとすぐにログに記録されることが示唆されます。私はそれらについて話しているlogger.debug("Error message");

とにかく、このエラーが返された後に何が行われるかの例を教えていただけますか?

ただし、1 つ指摘しておきます。処理結果とエラーの両方に同じ配列 / リスト / コレクションを使用すると、混乱する傾向があります。また、メソッドがエラー リスト (エラーがない場合は空/null リスト) を返した場合、エラーはメソッドを実行した結果そのものであるように見えるため、混乱を招きます。

于 2013-03-04T16:37:08.317 に答える
1

リストを使用してすべてのエラー情報を収集しようとすることに問題はありません。を使用するArrayListと問題なく動作します。心配する必要はありません...

エラーがないことがわかっている場合は、return Collections.emptyList();.

null一般にコレクションでは、両方または空のリストを返すことは避けてください。forループを壊さないので、私は常に空のリストを使用します。

于 2013-03-04T16:37:28.510 に答える