2

关于 Java 性能的一个非常不重​​要的问题,但它让我今天感到疑惑。

说我有简单的吸气剂:

public Object getSomething() {
     return this.member;
}

现在,假设我在某个函数/算法中需要两次(或更多)getSomething() 的结果。我的问题:调用 getSomething() 两次(或更多)或声明一个临时的局部变量并从那时起使用此变量有什么区别吗?

也就是说,要么

public void algo() {
    Object o = getSomething();

    ... use o ...
}

或者

public void algo() {
    ... call getSomething() multiple times ...
}

我倾向于混合这两种选择,没有具体原因。我知道这没关系,但我只是想知道。

谢谢!

4

3 回答 3

6

从技术上讲,不多次调用该方法会更快,但情况可能并非总是如此。JVM 可能会将方法调用优化为内联,您根本看不到差异。在任何情况下,差异都可以忽略不计。

但是,始终使用吸气剂可能更安全。如果状态的值在您的调用之间发生变化怎么办?如果要使用一致的版本,则可以保存第一次调用的值。否则,您可能希望始终使用 getter。

在任何情况下,您都不应该根据性能做出此决定,因为它是如此微不足道。我会选择一个并坚持下去。我建议总是通过你的 getter/setter。

于 2012-05-15T20:49:39.563 回答
1

Getter 和 setter 是关于封装和抽象的。当您决定多次调用 getter 时,您就是在对该类的内部工作做出假设。例如,它不进行昂贵的计算,或者该值不会被其他线程更改。

我认为最好调用一次 getter 并将其结果存储在一个临时变量中,从而允许您自由重构实现类。

作为轶事,我曾经被 getter 返回数组的变化所困扰,但实现类从数组属性更改为使用列表并在 getter 中进行转换。

于 2012-05-15T21:44:44.470 回答
0

编译器应该优化其中任何一个,使其成为基本相同的代码。

于 2012-05-15T20:49:45.603 回答