2012-01-16 69 views
2

我读了Android开发者指南本节:Android开发者:避免内部获取者/设置者?

here

,我想知道什么是“虚拟方法调用”又是什么意思时,它说:“本地”使用的getter/setter ?我试图弄清楚他们说的是避免使用方法EVER(例如来自实例化对象的方法)还是仅仅在已经在工作的类中获取变量?

总结起来,如果我在不同的班级,我想知道在不同班级中的变量的值,那么执行otherclass.getX()会比做otherclass.x更昂贵吗?或者,如果它不在当前类中执行方法或直接访问公共变量,它是否具有相同的性能?

回答

2

使用getter和setter方法是更昂贵的,因为第一个虚拟机从一个虚拟的方法查表的方法,然后拨打电话。 为了更快地访问Android,直接访问成员变量减少了开销

+0

因此,我决定是否需要方法的便利性或访问公共成员的性能收益? – 2012-01-16 06:47:31

3

在那篇文章中,他们指的是内部访问私有成员,并直接在字段中进行访问,而不是在同一个类中调用getX()。

仍然建议(和普通)使会员私密并提供公共访问者方法供外部使用。

HTH

2

本文的基本内容是避免getter/setter模式,当你可以避开它时。在Java中,所有方法都是虚拟的,没有用private或final修饰符标记,所以他们说如果你的代码不是由其他类实现的接口,直接访问这些字段。他们指出的原因很可能是因为传统上,Java建议始终使用getter/setter模式,以便您的变量可以保持私密。然而,在Android中,如果添加这个额外的抽象层,则可以获得相当精彩的性能。

所以,总结。如果你正在创建一个其他类将实现的API,那么也许值得让getter/setter的性能受到影响。但是,在你自己的类中,每个类都与每个类互相作用,而你没有执行合约,只需直接访问变量。访问您班级的外部班级也会通过直接访问变量来获得相同的绩效提升,但在某些时候,您需要进行绩效维护性评估,以查看您是否愿意公开这些变量或是否值得打击和使用getter/setter方法

0

在Java中总是使用getter(并经常使用setter)有很多很好的理由,即使在为Droid编写代码时,仍然坚持使用它。

尽管天真地使用虚拟方法(即getters/setters)而不是实例字段访问,Dalvik的成本更高 - 您可以通过使用ProGuard在构建时内联这些调用来避免这种情况!

以这种方式,您在编码时坚持最佳实践,同时避免任何性能下降。