'避免内部吸收者/安装者'

只需在开发者网站上阅读以下内容:

避免内部吸收者/安装者

在像C ++这样的本地语言中,通常使用getter(例如i = getCount())而不是直接访问字段(i = mCount)。 对于C ++来说,这是一个很好的习惯,因为编译器通常可以内联访问,如果需要限制或调试字段访问,则可以随时添加代码。

在Android上,这是一个坏主意。 虚拟方法调用比实例字段查找更昂贵。 遵循常见的面向对象的编程实践是合理的,并且在公共接口中有getter和setter,但在一个类中,您应该总是直接访问字段。

没有JIT,直接字段访问比调用一个简单的getter快3倍。 使用JIT(直接字段访问与访问本地一样便宜),直接字段访问比调用一个简单的getter快7倍。 Froyo确实如此,但在JIT内嵌getter方法时将来会有所改进。

那么它是说你会在课堂上使用字段访问:

 public class MyObject {

    public Object innerObject; // This would be private if I was using a getter

    public void doSomeStuff(){
          if(innerObject){        // Within class access like this
                 // ....
          }
    }

    public Object getInnerObject(){  // This would be removed if I was using field access
         return innerObject;
    }
 }

但是从另一个对象访问呢?:

 public class SecondObject {

      public void doSecondSomething(){
                MyObject ob = new MyObject();
                Object inner;

                //This is my question basically (from an Android performance perspective)   
                inner = ob.getInnerObject();
                // OR 
                inner = b.innerObject

       }

 }

使用内部getter和setter的性能命中也适用于外部getter和setter。

然而,在外部情况下,吸气剂和安装剂在其他领域具有显着的优势; 如保护封装,减少有害耦合,使代码更易于维护等等。 所以,尽管这可能会导致性能下降,但通常认为这是使用getter和setter的最佳做法。

性能下降是当前一代Android JIT编译器局限性的结果。 这种情况肯定会改善与姜饼的改善。 (参考 - https://stackoverflow.com/a/4930538/139985 ...并注意谁写的答案!)

一般来说,为一个劣质平台“调整”你的代码是一个糟糕的主意,特别是如果有合理的机会出现更好的代码。


尽管b.innerObject速度更快,但随着技术的进步(更好的cpus,JIT等),两种选择之间的差异会变小。

唯一需要注意的地方是在密集的循环中完成,而这些循环始终执行。 例如,在游戏的onDraw方法中,当您循环访问数百个对象时。


请记住,只有在每秒访问成员数千次的情况下,这些性能考虑才有意义。

直接访问可能是一个好主意的一个很好的例子是游戏的场景图(libgdx)

public abstract class Actor {
    public Group parent;
    public final String name;
    public boolean touchable = true;

    public float x;
    public float y;
    public float width;
    public float height;
    public float originX;
    public float originY;
    public float scaleX = 1;
    public float scaleY = 1;
    public float rotation;
    public final Color color = new Color(1, 1, 1, 1);
链接地址: http://www.djcxy.com/p/23671.html

上一篇: 'Avoid Internal Getters/Setters'

下一篇: Android Performance improvement