Производительность Android - «Избегайте внутренних геттеров / сеттеров»

Просто прочтите это на сайте разработчиков:

Избегайте внутренних методов получения / установки

В нативные языки, такие как C ++, обычной практикой является использование геттеров (например, i = getCount ()) вместо прямого доступа к полю (i = mCount). Это отличная привычка для C ++, потому что компилятор обычно может встроить доступ, и если вы необходимо ограничить или отладить доступ к полям, вы можете добавить код в любое время.

Для Android это плохая идея. Вызов виртуальных методов обходится дороже, чем поиск в полях экземпляра. Разумно придерживаться обычных объектно-ориентированных практики программирования и имеют геттеры и сеттеры в общедоступном интерфейсе, но внутри класса вы всегда должны обращаться к f ields напрямую.

Без 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

       }

 }

23
задан Stephen C 2 May 2019 в 22:51
поделиться