Просто прочитайте это на сайте разработчика:
Избегайте внутренних добытчиков/сеттеров
В родных языках, таких как C++, обычной практикой является использование методов получения (например, я = getCount()) вместо прямого доступа к полю (i = mCount). Это отличная привычка для C++, потому что компилятор обычно может встроить доступ, и если вам нужно ограничить или отладить доступ к полю, вы можете добавить код в любое время.
На Android это плохая идея. Вызовы виртуальных методов стоят дорого, намного больше, чем поиск полей экземпляра. Разумно следовать общепринятым методам объектно-ориентированного программирования и иметь в открытом интерфейсе методы получения и установки, но внутри класса вы всегда должны обращаться к полям напрямую.
Без JIT прямой доступ к полю примерно в 3 раза быстрее, чем вызов тривиального геттера. С JIT (где прямой доступ к полю обходится дешевле, чем доступ к локальному), прямой доступ к полю примерно в 7 раз быстрее, чем вызов тривиального геттера. Это верно для Froyo, но улучшится в будущем, когда JIT встроит методы получения.
Обновление в 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
}
}