Java 频繁访问对象属性是否会带来成本?

Java 频繁访问对象属性是否会带来成本?,java,code-formatting,code-readability,Java,Code Formatting,Code Readability,在编写代码时,我最常遵循的一点是,如果我看到某个对象属性或方法在同一个方法中被多次访问,我倾向于将其分配给一个变量,并在任何地方重复使用它 List itemAList=alpha.doX(…,…,…) .peek(item->packagedItems.put(item.getName(),…) .peek(item->readyItems.put(item.getName(),…,…)) .map(项->转换(项.getName(),…) .collect(toList()); 正如我们所

在编写代码时,我最常遵循的一点是,如果我看到某个对象属性或方法在同一个方法中被多次访问,我倾向于将其分配给一个变量,并在任何地方重复使用它

List itemAList=alpha.doX(…,…,…)
.peek(item->packagedItems.put(item.getName(),…)
.peek(item->readyItems.put(item.getName(),…,…))
.map(项->转换(项.getName(),…)
.collect(toList());
正如我们所看到的,
item.getName()
已经被多次使用。我通常会将其移动到一个变量并重新使用它:

String itemName=item.getName();
列表项列表=alpha.doX(…,…,…)
.peek(item->packagedItems.put(itemName,…)
.peek(item->readyItems.put(itemName,…))
.map(项目->转换(项目名称,…)
.collect(toList());
我有时也会在代码审查中提出同样的建议。但是,我现在想知道,与直接从变量访问相比,从对象实例取消引用是否会带来性能成本

关于这种做法有什么想法?在什么情况下(如果有的话),一个会比另一个好

谢谢。

(忽略第二个代码中的错误,
项已在使用中。)

当一个方法是
final
时,编译器可以内联,因为这取决于编译器来确定该方法是否足够“简单”以进行内联。getter和setter通常足够简单,可以内联

如果不是这样,JIT很可能迟早会在运行时内联getter,因此无论哪种方式
item.getName()
都将被
item.name

性能问题不大。

(忽略第二个代码中的错误,
已在使用。)

当一个方法是
final
时,编译器可以内联,因为这取决于编译器来确定该方法是否足够“简单”以进行内联。getter和setter通常足够简单,可以内联

如果不是这样,JIT很可能迟早会在运行时内联getter,因此无论哪种方式
item.getName()
都将被
item.name


性能问题不大。

您发布的两个代码片段具有不同的语义。事实上,第二个版本甚至不应该编译,说明变量
item
已经定义。即使要编译
item->…(item.getName).
也是一个lambda函数,因此不等同于
item->…(itemName).
。您发布的两个代码片段具有不同的语义。事实上,第二个版本甚至不应该编译,说明变量
item
已经定义。即使要编译
item->…(item.getName).
也是一个lambda函数,因此不等同于
item->…(itemName).
。不应该依赖于方法的JIT内联。如果不经常调用getter,它将不会内联。(值得注意的是,当方法被视为“热”时,您可以配置阈值)。另外,如果一个类有任何继承自它的类,那么它的非final方法就不是内联的候选方法,不应该依赖于JIT内联方法。如果不经常调用getter,它将不会内联。(值得注意的是,当方法被视为“热”时,您可以配置阈值)。另外,如果一个类有任何继承自它的类,那么它的非final方法就不是内联的候选方法。