内存是否可以初始化一个将被频繁调用的方法中的变量? 基本上,这个示例方法是:
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;
}
是的,我知道这些不是最好的例子,而且它们有一些冗余。对不起。
无论如何,提前谢谢。
答案 0 :(得分:8)
效率的差异(如果有的话)极有可能完全无关紧要。如果amount
不需要在方法之外可见,则更喜欢第二个版本,因为它没有不必要的副作用并且是线程安全的。
要扩展最后一点,如果多个线程在同一个对象上调用method()
,则第一个版本对竞争条件开放。
答案 1 :(得分:4)
来自 Effective Java(第2版):
永远不要为表现牺牲合理的架构原则(例如信息隐藏)。
第55项:明智地优化
- 不要为了表现而牺牲合理的建筑原则。努力编写好的程序,而不是快速的程序。
- 良好的程序体现了信息隐藏的原则:在可能的情况下,它们在单个模块中本地化设计决策,因此可以在不影响系统其余部分的情况下更改个人决策。
和
第45项:最小化本地变量的范围
通过最小化局部变量的范围,可以提高代码的可读性和可维护性,并降低出错的可能性。
较旧的编程语言,例如C,要求必须在块的头部声明局部变量,并且一些程序员继续习惯这样做。这是一个值得打破的习惯。作为温和提醒,Java允许您在声明合法的任何地方声明变量。
首先使用最强大的技术来最小化声明它的局部变量的范围。
几乎每个局部变量声明都应包含一个初始值。
所以最好的方法似乎是第二种方法。
答案 2 :(得分:1)
如果您不需要在其他方法中使用它,第二种方法会更好;由于在堆栈上分配的方法内部的变量非常快,因此性能不是问题。
然而,在您的特定情况下,这种方法会更好,并且一个好的IDE会建议它:
private boolean method() {
return Random.nextInt(0, 100) == 50;
}
答案 3 :(得分:0)
我不会真的担心内存效率,因为我担心并发访问导致的错误。
return amount == 50;
当在多个实例中使用此类时,实例变量amount
可能会有所不同。没有适当的记忆障碍,这将导致错误的结果。如果方法完成,则int超出范围,如果它是局部变量。
说到这,为什么这里需要一个变量呢?这不会吗?
return Random.nextInt(0, 100) == 50;
答案 4 :(得分:0)
局部变量是方法的内部变量。最好保持每个变量的范围尽可能小。但是,如果多个方法需要访问变量,则定义实例或类变量。