【问题标题】:Android Dev: Avoiding Internal Getters/Setters?Android 开发:避免内部获取器/设置器?
【发布时间】:2012-01-16 06:22:49
【问题描述】:

我正在阅读 Android 开发指南中的这一部分:

here

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

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

【问题讨论】:

    标签: java android optimization methods


    【解决方案1】:

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

    仍然建议(并且很常见)将成员设为私有并提供公共访问器方法供外部使用。

    HTH

    【讨论】:

      【解决方案2】:

      使用 getter 和 setter 成本更高,因为首先 VM 会从虚拟方法表中查找方法,然后进行调用。 为了在 Android 上更快地访问,直接访问成员变量减少了开销

      【讨论】:

      • 所以由我来决定我是否想要一种方法的便利性或访问公共成员的性能增益?
      【解决方案3】:

      这篇文章的基本意思是当你可以摆脱它时避免使用 getter/setter 模式。在 Java 中,所有方法都是虚拟的,没有用 private 或 final 修饰符标记,所以他们说如果你的代码不是由其他类实现的接口,只需直接访问字段。他们指出这一点的原因很可能是因为传统上,Java 建议始终使用 getter / setter 模式,以便您的变量可以保持私有。但是,在 Android 中,如果添加这个额外的抽象层,您可能会受到相当严重的性能影响。

      所以,总而言之。如果您正在创建一个其他类将实现的 API,那么可能值得接受 getter/setter 的性能影响。但是,在您自己的类中,它们都与每个类交互并且您不执行合同,只需直接访问变量即可。访问您的类的外部类也将通过直接访问变量来获得相同的性能提升,但在某些时候,您需要进行性能与可维护性评估,以查看您是否愿意将这些变量公开或是否值得命中并使用 getter / setter 方法

      【讨论】:

        【解决方案4】:

        在 Java 中始终使用 getter(并且经常使用 setter)有很多很多很好的理由,即使在为 'Droid.

        虽然 Dalvik 使用虚拟方法(即 getter/setter)而不是实例字段访问的成本更高,但您可以通过使用 ProGuard 在构建时内联这些调用来避免这种情况!

        通过这种方式,您可以在编码时遵循最佳实践,同时避免任何性能损失。

        【讨论】:

          猜你喜欢
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          • 2011-11-26
          • 1970-01-01
          • 1970-01-01
          • 2014-10-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多