2

どちらが良いですか?

List list = ... //get list from somewhere

for (int i=0; list != null && i < list.size(); i++){
    // ...
}

また?

List list = ... //get list from somewhere


if (list != null){
    for (int i = 0; i < list.size(); i++){
        // ...
    }
}

私はここからアイデアを得ました:ScalaまたはJava?神話と事実を探る

4

5 に答える 5

5

より良いとはどういう意味ですか? より読みやすいコードか、より効率的なコードか? とにかく、私はあなたの 2 つの提案のいずれも好みません。

Listを返すが、おそらく返すメソッドを使用する必要がある場合null(そのメソッドのソース コードを変更して空のList代わりに返すことはできません)、これが私が行うことです。

List list = ... // get list from somewhere
if (list == null) {
    list = Collections.emptyList();
}
for (int i = 0; i < list.size(); i++) {
    // ...
}

IMHOこれは、読みやすさ、パフォーマンスの点で勝ち、コードの深いネストを回避します。

于 2013-01-15T18:29:35.927 に答える
2

null チェックをループの外に残します。

行をループ終了条件にマージすることで行を保存できますが、明快さが失われるため、誰もそれを好みません。

ループ コード セクションには反復関連のコードのみを含める必要があります。

これは基本的な適切なコーディング スタイルのガイドラインです。

また、リストがnullの場合でもループを開始して初期化コードを実行する必要があるため、チェックをマージするのもおそらく少し遅くなります。

最後に、便利な foreach 構文を使用するようにリファクタリングする場合、null チェックをマージすることはできません。

List<T> list;
if (list != null) {
    for (T t : list) {
        // ...
    }
{
于 2013-01-15T18:31:19.133 に答える
1

あなたの提案はどちらも効率的ではありません。以下のようなコードをお勧めします (毎回不必要なメソッド呼び出し list.size() を行う理由):-

List list = ... //get list from somewhere

int size = (list==null ? 0 : list.size());

for (int i = 0; i < size; i++){
    // ...
}

このようにして、コードは読みやすく効率的になります。

于 2013-01-15T19:41:27.327 に答える
1

2つ目....最初のアプローチでは、ループのたびに、不要なnullチェックが発生しています

于 2013-01-15T18:28:25.750 に答える
0

性能的には同じだろう。読みやすさの問題については、2番目のものをお勧めします。それは私にとってはるかに読みやすく、きれいです。

于 2013-01-15T18:28:19.110 に答える