Java中的过早优化:何时使用“x = foo.getX()”与简单地使用“foo.getX()”

2022-09-04 05:39:43

当我发现自己多次调用相同的 getter 方法时,这应该被视为一个问题吗?[总是]分配给局部变量并只调用一次是否更好?

我确信答案当然是“视情况而定”。

我更关心的是更简单的情况,其中getter只是一个“传递私有变量的值”类型的方法。即,不涉及昂贵的计算,不消耗数据库连接等。

我的“是否更好”的问题与代码可读性(样式)和性能有关。也就是说,它是否对性能有很大影响:

SomeMethod1(a, b, foo.getX(), c);
SomeMethod2(b, foo.getX(), c);
SomeMethod3(foo.getX());

与:

X x = foo.getX();
SomeMethod1(a, b, x, c);
SomeMethod2(b, x, c);
SomeMethod3(x);

我意识到这个问题有点挑剔和灰色。但我刚刚意识到,我根本没有一致的方式来评估这些权衡。我钓鱼的一些标准不仅仅是完全异想天开。

谢谢。


答案 1

选择不应该真正与性能影响有关,而应与代码可读性有关。

创建变量时,可以为其指定在当前上下文中应得的名称。当您多次使用相同的值时,它肯定具有真正的含义,而不是方法名称(或者更糟的是一连串方法)。
阅读起来真的更好:

String username = user.getName();
SomeMethod1(a, b, username, c);
SomeMethod2(b, username, c);
SomeMethod3(username);

SomeMethod1(a, b, user.getName(), c);
SomeMethod2(b, user.getName(), c);
SomeMethod3(user.getName());

答案 2

对于普通的 getters - 那些只返回一个值的 getter - HotSpot 在调用代码中内联它,因此它将尽可能快。

但是,我有一个关于在一行上保留语句的原则,这通常会导致像“foo.getBar()”这样的表达式太长而不适合。然后,对我来说,将其提取到局部变量(“Bar bar = foo.getBar()”)更具可读性。