Java Setter和Getter函数。在Android中。性能开销?

Java Setter和Getter函数。在Android中。性能开销?,java,android,setter,getter,Java,Android,Setter,Getter,当我学习Java标准版时,getter和setter函数经常用于隐藏变量并减少对它们的直接访问。有几个消息来源告诉我,在Android中,你不应该使用这些函数,而应该直接修改变量。原因是在Android中使用getter和setter时,会由于开销而导致性能损失。导致更多内存使用并降低系统速度 这是真的吗?如果有,为什么使用getter和setter会造成性能损失?setter和getter的性能损失可以忽略不计。公共字段是不好的做法,违反了面向对象的数据封装和信息隐藏原则 使用setter或g

当我学习Java标准版时,getter和setter函数经常用于隐藏变量并减少对它们的直接访问。有几个消息来源告诉我,在Android中,你不应该使用这些函数,而应该直接修改变量。原因是在Android中使用getter和setter时,会由于开销而导致性能损失。导致更多内存使用并降低系统速度


这是真的吗?如果有,为什么使用getter和setter会造成性能损失?

setter和getter的性能损失可以忽略不计。公共字段是不好的做法,违反了面向对象的数据封装和信息隐藏原则

使用setter或getter需要一个属性调用,而不是直接访问字段。这没什么,所以不用担心——专注于编写好的代码

编辑:

为了澄清,这是其他海报引用的同一份android文档:

遵循常见的面向对象编程实践是合理的 并且在公共接口中有getter和setter,但是在 类,您应该始终直接访问字段


换言之,您仍然需要getter和setter。您应该尽量避免从包含这些方法的类中调用它们,因为您可以直接访问该字段

在android中使用getter和setter是一个坏主意。正如它所说

这在Android上是个坏主意。虚拟方法调用非常昂贵, 比实例字段查找更重要。这样做是合理的 通用的面向对象编程实践,具有getter和 在公共接口中,但在类中,您应该始终 直接访问字段


查找有关性能的更多信息。

根据Google android团队提供的性能提示:

如果没有JIT,直接字段访问比调用 琐碎的获取者。使用JIT(直接现场访问与 直接现场访问速度约为本地访问速度的7倍 调用一个微不足道的getter

然而,我同意良好的编码实践更为重要,团队还提到:

请注意,如果您使用的是ProGuard,则可以两者兼得 因为ProGuard可以为您内联访问器

因此,我认为可以使用getter和setter;)


根据您的建议,您应该避免使用它们。好问题!虽然我想知道,如果我完全违背了他们的建议,我的应用程序会受到多大的冲击?医生确实说要避免它们,但我不认为在大多数情况下压力是显著的。我偶尔会使用它们来公开某些字段,但您可能希望在使用它们时假设它们确实会增加一些开销。保持呼叫不在循环/进程密集型块中,你应该没事。正如@hungr的回答中所述,在android中,它们的性能可以说是“不可忽略”(慢3-7倍),但除此之外,你的答案是正确的——在类内直接访问,除普通类外的所有类的外部getter/setter。除此之外:这主要指向当方法很普通时使用此方法的内部获取和设置。对于良好的编程实践,应该通过getter和setter对值进行外部调用;内部非琐碎的获取和设置应该通过方法来实现。