对于 Java,我非常习惯将所有变量声明为私有变量并生成公共 getter 和 setter 以遵守通用约定。
不过,我觉得很好奇:对于除了分配和返回请求的值之外没有任何功能的 getter 和 setter,调用以下方法不会对性能造成影响:
String getValue() {
return value;
}
而不是:
classInstance.value;
编译器是否在这里做了一些事情来帮助防止函数调用添加额外的循环? 如果不是,那么这个理论上的打击是否会像滚雪球一样在更强大的应用程序中产生巨大的打击?
编辑:: 需要澄清的是,这个问题不是问为什么应该或不应该使用访问器方法,问题是使用访问器是否会影响性能。
编译器是否在这里做了一些事情来帮助防止函数调用添加额外的循环?
是的。
Hotspot JIT 编译器将内联短方法,并且简单的 getter 或 setter 足够短以允许这样做。 内联方法体消除了参数组装和方法调用的开销,并允许在调用方法的上下文中进一步进行局部优化。
最终结果是,使用 getter 和 setter 不会对现代 JVM(tm) 造成性能影响
(一些早期的 Android 编译器没有这样做,但这已得到纠正。)
我不知道 Java 是否会做类似的事情,但 C++ 可以内联这类东西。
我也喜欢使用 getter 和 setter,但它们比普通变量慢。
因此,如果您正在创建 API,请使用 getter 和 setter;如果您需要性能,请选择公共变量,而可读性并不那么重要。