Конечные переменные в методе onDraw()

У меня есть класс, который расширяет View и переопределяет метод onDraw(Canvas canvas). Это представление запускает анимацию, поэтому onDraw будет вызываться много раз в секунду. Рассмотрим следующий пример...

@Override
protected void onDraw(Canvas canvas) {
  final int width = getWidth();
  final int height = getHeight();

  final int padLeft = getPaddingLeft();
  final int padTop = getPaddingTop();
  final int padRight = getPaddingRight();
  final int padBottom = getPaddingBottom();

  final RectF oval = new RectF(padLeft, padTop, width - padRight, height - padBottom);
  ...
}

Должен ли я беспокоиться о том, что при каждом вызове onDraw происходит так много вызовов функций? Говорит ли final компилятору, что ему не нужно каждый раз вызывать эти функции? Будет ли лучше использовать эти переменные как member variables, чтобы функции вызывались только один раз?

P.S. Я знаю из запуска моей программы, что производительность не пострадала. Я задаю этот вопрос с точки зрения обучения. Мне становится легче, когда я точно знаю, что делаю.


person dfetter88    schedule 06.07.2011    source источник


Ответы (1)


говоря final здесь, вы просто говорите, что эта локальная переменная не будет изменена в этой функции, и функции будут вызываться каждый раз, когда вы вызываете onDraw. Если есть возможность, лучше скомпоновать все эти переменные в другой класс, например DisplayProperties, и инициализировать его только один раз.

person Fedor Skrynnikov    schedule 06.07.2011
comment
Да, но я совершенно уверен, что ключевое слово final также намекает компилятору, что он может оптимизировать переменную. - person dfetter88; 07.07.2011
comment
Что вы подразумеваете под оптимизацией. Нет, это не может заменить вызовы функций. Да, эти переменные не нужно перезагружать из основной памяти. подробнее здесь stackoverflow.com/questions/6602922/ - person Fedor Skrynnikov; 07.07.2011
comment
Хорошо знать. Значит, единственный способ избежать вызовов функций — создать переменные-члены? - person dfetter88; 07.07.2011
comment
способ избежать множественных вызовов — позвонить только один раз. В вашем случае лучше составить все эти отдельные переменные и инициализировать их только один раз из функции onDraw. - person Fedor Skrynnikov; 07.07.2011