【发布时间】:2011-10-06 16:24:22
【问题描述】:
只需在开发网站上阅读此内容:
Avoid Internal Getters/Setters
在 C++ 等本地语言中,通常使用 getter(例如 i = getCount())而不是直接访问字段(i = mCount)。这对于 C++ 来说是一个很好的习惯,因为编译器通常可以内联访问,如果需要限制或调试字段访问,可以随时添加代码。
在 Android 上,这是一个坏主意。虚拟方法调用很昂贵,比实例字段查找要贵得多。遵循常见的面向对象编程实践并在公共接口中使用 getter 和 setter 是合理的,但在类中您应该始终直接访问字段。
在没有 JIT 的情况下,直接访问字段比调用普通的 getter 快大约 3 倍。使用 JIT(直接字段访问与访问本地一样便宜),直接字段访问比调用普通 getter 快约 7 倍。这在 Froyo 中是正确的,但在未来 JIT 内联 getter 方法时会有所改进。
2019/05 更新:在当前版本中,上述材料已从文档中删除!
也就是说你会在类中使用字段访问:
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
}
}
【问题讨论】:
-
只是指出这一点,请记住,Dalvik 不是 JVM,这种做法不应被视为普通 Java 开发中的通用方式。
-
您的报价说明了一切,不是吗? 遵循常见的面向对象编程实践并在公共接口中使用 getter 和 setter 是合理的。另外:不要过度设计。除非您进行大量调用,否则只需使用 getter。或有速度问题。
标签: java android performance optimization