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

更好是什么意思?更易读的代码,还是更高效的代码?无论如何,我不喜欢你的两个建议中的任何一个。

当我必须使用一个方法,它返回 a List,但可能返回null(我不能更改该方法的源代码以返回一个空List),这就是我所做的:

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

恕我直言,这在可读性、性能方面获胜,并避免了我们代码的深度嵌套。

于 2013-01-15T18:29:35.927 回答
2

将空检查留在循环之外。

尽管您可以通过将一行合并到循环终止条件中来保存它,但没有人会这样做,因为您会失去清晰度:

您应该只在循环代码部分中包含与迭代相关的代码!

这是一个基本的良好编码风格指南。

此外,合并检查也可能稍微慢一些,因为即使列表为空,您也必须启动循环并执行初始化代码。

最后,如果你想重构使用方便的 foreach 语法,你不能合并空检查:

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

第二个......在第一种方法中,每次循环都会发生不必要的空检查

于 2013-01-15T18:28:25.750 回答
0

在性能上也是一样的。对于可读性问题,我更喜欢第二个。它对我来说更具可读性和清洁性。

于 2013-01-15T18:28:19.110 回答