我正在阅读Android开发指南中的这一部分:
我想知道什么是“虚拟方法调用”,当它使用getter / setter说“本地”时它是什么意思?我试图弄清楚他们所说的是否避免使用方法EVER(例如来自实例化对象的方法)或者只是在你已经工作的类中获取变量?
基本上总结一下,如果我在一个不同的班级并且我想知道一个变量在另一个班级中的价值,那么otherclass.getX()
比做otherclass.x
要贵{{1}} }?或者,如果不是在当前类中进行方法或直接访问公共变量,它是否具有相同的性能?
答案 0 :(得分:3)
在那篇文章中,他们指的是内部访问私有成员,并直接使用字段,而不是在同一个类中调用getX()。
仍然建议(并且通常)将成员设为私有,并提供公共访问方法供外部使用。
HTH
答案 1 :(得分:2)
使用getter和setter更加昂贵,因为首先VM将从虚拟方法表中查找方法,然后进行调用。 为了更快地访问Android,直接访问成员变量可以减少开销
答案 2 :(得分:2)
这篇文章基本上是说当你可以侥幸逃脱时,避免使用getter / setter patten。在Java中,所有方法都是Virtual,没有用private或final修饰符标记,所以他们说如果你的代码不是其他类实现的接口,那么只需直接访问这些字段。很可能他们指出这一点的原因是因为传统上,Java建议一直使用getter / setter模式,以便您的变量可以保持私有。但是,在Android中,如果添加这个额外的抽象层,则可以获得非常好的性能。
总而言之。如果您正在创建其他类将实现的API,那么获取getter / setter的性能可能是值得的。但是,在您自己的类中,所有类都与每个进行交互而您没有执行合同,只需直接访问变量即可。通过直接访问变量,访问您的类的外部类也将获得相同的性能提升,但在某些时候,您需要进行性能到可维护性评估,以确定您是否愿意公开这些变量或者是否值得采取这些变量命中并使用getter / setter方法
答案 3 :(得分:0)
在Java中总是使用getter(并经常使用setter)有很多很好的理由,即使为'Droid编写代码,它仍然是一个很好的做法。
尽管使用虚拟方法(即getter / setter)而不是实例字段访问,Dalvik的成本较高,但您可以通过使用ProGuard在构建时内联这些调用来避免这种情况!
通过这种方式,您可以在编码时遵循最佳实践,同时避免任何性能损失。