何时创建临时帮助程序变量才有意义



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

我在以下截图中遇到了这个问题:什么更好:两次访问Listsize值,或创建一个保存列表大小的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 属性无数次,还是创建一个保存大小的变量?

我们没有"更好"的方法:

  1. 调用list.size或本地size参数时,它具有相同的性能
  2. 根据Doug Lea的说法,将局部参数声明为final可能会导致性能改进
  3. 唯一"易于使用"的
  4. 方面是当您想要一个"更短"的参数时,因此通过使用:本地size参数而不是myListOfReallyNiceIntegers.size会更容易读/写(使用 for 循环等)。

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

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

然后我会采用可变方法,但除此之外没什么大不了的。

但是,如果这是一个循环或时间关键方法

,那么在循环(或时间关键方法内部)调用 list.size 只会浪费额外的时间进行方法调用,应该避免。

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

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

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

最新更新