Java中的过早优化:何时使用"x = foo.getX()"vs"foo.getX()"

Aar*_* Fi 13 java coding-style

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

我肯定答案当然是"这取决于".

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

我的"它更好"的问题涉及代码可读性(样式)和性能.即具有如此大的性能影响:

SomeMethod1(a, b, foo.getX(), c);
SomeMethod2(b, foo.getX(), c);
SomeMethod3(foo.getX());
Run Code Online (Sandbox Code Playgroud)

VS:

X x = foo.getX();
SomeMethod1(a, b, x, c);
SomeMethod2(b, x, c);
SomeMethod3(x);
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Col*_*ert 15

选择不应该是关于性能损失,而是关于代码可读性.

创建变量时,可以在当前上下文中为其指定应有的名称.当你多次使用相同的值时,它肯定具有真正的意义,而不仅仅是方法名称(或更糟糕的方法链).
最好是阅读:

String username = user.getName();
SomeMethod1(a, b, username, c);
SomeMethod2(b, username, c);
SomeMethod3(username);
Run Code Online (Sandbox Code Playgroud)

SomeMethod1(a, b, user.getName(), c);
SomeMethod2(b, user.getName(), c);
SomeMethod3(user.getName());
Run Code Online (Sandbox Code Playgroud)

  • IMO,`user.getName()`有时更容易阅读,因为您不必搜索(并向上滚动)到它已设置的位置.您可能也将变量命名为`username`,如果它是通过`request.getUsername()`设置的 - 那么它是哪一个? (2认同)

Tho*_*sen 8

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

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


gbn*_*gbn 6

它们可能是两件不同的东西.

如果GetX是非确定性的,那么第一个将得到与第二个不同的结果

就个人而言,我会使用第二个.它更明显,更少不必要的冗长.

  • 你要找的词是"幂等的".`X + = 2; return x;`是完全确定的,但在多次调用时会给出不同的结果. (3认同)