2

我想知道在哪些情况下您更愿意创建某种“帮助”变量来访问可能在方法中使用 2 次或更多次的值。

我在以下片段中遇到了这个问题:什么更好:两次访问sizea 的值List,或者创建一个Integer保存列表大小的变量?

List<String> list;

private myIndexHelper() {
    if (list.size % 2 == 0) {
        return PREFIX + list.size;
    }
    return "";
}

private myIndexHelper() {
    int size = list.size;
    if (size % 2 == 0) {
        return PREFIX + size;
    }
    return "";
}

我知道这可能是过度优化。但总的来说(忽略性能):您宁愿访问 list.size 属性 numerus 次,还是创建一个保存大小的变量?

4

3 回答 3

1

我们没有“更好”的方法:

  1. 当您调用list.size或本地size参数时,它具有相同的性能
  2. 根据Doug Lea的说法,将本地参数声明为final可能会提高性能
  3. “易于使用”的唯一方面是当您想要一个“更短”的参数时,因此通过使用:本地size参数而不是myListOfReallyNiceIntegers.size更容易读/写(使用 for 循环等)。
于 2013-11-06T16:18:04.563 回答
0

在这种情况下,我会说可读性,如果它是可读的,那么任何一种方式都可以。另一方面,如果它是

private myIndexHelper() {
    if (dataStricture.subDataStructure.list.size % 2 == 0) {
        return PREFIX + dataStricture.subDataStructure.list.size;
    }
    return "";
}

然后我会采用可变方法,否则没什么大不了的。

但是,如果这是一个循环或时间关键方法,那么在循环内(或时间关键方法内)调用 list.size 只会浪费额外的时间来进行方法调用,应该避免。

就像我说的那样,在这段代码中,没什么大不了的。

于 2013-11-06T16:14:30.643 回答
0

由于今天通常有大量可用内存,因此添加一个辅助变量可能会更好,因为它可能会增加代码的可读性(尽管这取决于,因为我个人发现函数调用在这种情况下更具可读性 - 除非它们像object.ref.function(object2.ref2.anotherFunction()) 或更糟)。

我认为还值得一提的是,有时这是一个很好的做法:当您在循环中多次使用某个值并且该值发生变化时,最好将该值存储在一个变量中而不是重新计算它每次(在循环中,处理器操作的实际数量可能会很快增长。)好的编译器通常会检测到在循环中重新计算相同值并自己创建变量的这种情况,但是依赖于它并不是一个好习惯在效率的情况下编译器。特别是如果您只需稍微更改代码即可实现它。

于 2013-11-06T16:39:43.447 回答