3

内存可以在将被相当频繁地调用的方法中初始化变量吗?基本上,是这个示例方法:

int amount;
private boolean method() {
    amount = Random.nextInt(0, 100);
    return amount == 50;
}

就此方法的内存效率而言,更多/更少/相同:

private boolean method() {
    int amount = Random.nextInt(0, 100);
    return amount == 50;
}

是的,我知道这些不是最好的例子,而且它们有一些冗余。对于那个很抱歉。

无论如何,提前谢谢。

4

5 回答 5

8

效率上的差异,如果有的话,很可能是完全不相关的。如果amount不需要在方法之外可见,则更喜欢第二个版本,因为它没有不必要的副作用并且是线程安全的。

扩展最后一点,如果多个线程要调用method()同一个对象,则第一个版本对竞争条件开放。

于 2013-04-21T12:46:36.060 回答
4

来自Effective Java(第 2 版)

永远不要为了性能而牺牲合理的架构原则(例如信息隐藏)。

第 55 条:明智地优化

  • 不要为了性能而牺牲合理的架构原则。努力编写好的程序而不是快速的程序。
  • 好的程序体现了信息隐藏的原则:在可能的情况下,它们将设计决策本地化在单个模块中,因此可以更改单个决策而不影响系统的其余部分。

和:

第 45 条:最小化局部变量的范围

通过最小化局部变量的范围,您可以提高代码的可读性和可维护性,并降低出错的可能性。

较早的编程语言,例如 C,要求必须在块的头部声明局部变量,一些程序员出于习惯继续这样做。这是一个值得打破的习惯。温馨提醒一下,Java 允许您在声明合法的任何地方声明变量。

  • 首先使用了最小化局部变量范围以声明它的最强大的技术。

  • 几乎每个局部变量声明都应该包含一个初始值设定项。

所以最好的方法似乎是第二种。

于 2013-04-21T12:55:29.907 回答
1

如果您不需要在其他方法中使用第二种方法,则更好;性能不是问题,因为在堆栈上分配的方法内的变量非常快。

但是,在您的特定情况下,这种方法会更好,并且一个好的 IDE 会建议它:

private boolean method() {    
    return Random.nextInt(0, 100) == 50;
}
于 2013-04-21T12:49:35.770 回答
0

我不会像担心并发访问导致的错误那样担心内存效率。

    return amount == 50;

当跨多个实例使用此类时,实例变量amount可能会有所不同。如果没有适当的内存屏障,这将导致错误的结果。如果 int 是局部变量,则方法完成时 int 超出范围。

说到这里,为什么这里需要一个变量呢?这不会吗?

return Random.nextInt(0, 100) == 50;
于 2013-04-21T12:48:01.567 回答
0

局部变量是方法的内部变量。最好使每个变量的范围尽可能小。但是如果多个方法需要访问一个变量,那么定义一个实例或类变量。

于 2013-04-21T12:48:36.410 回答