Эмуляция условной компиляции а-ля C++

Ответить
ValeriusSR
Сообщения: 9
Зарегистрирован: 14 дек 2012, 09:14

Эмуляция условной компиляции а-ля C++

Сообщение ValeriusSR » 11 янв 2013, 09:20

Здравствуйте.

Нет-нет, путаю я ресурсные идентификаторы R.id.something, а то и просто ошибаюсь при назначении.
В результате вызовы вроде ImageView _iv = (ImageView)findViewById(R.id.logoImage), возвращающие нулевой указатель,
приводят к исключениям и утомительному поиску по коду.
Прихоится загрязнять код многочисленными проверками навроде

Код: Выделить всё

ImageView _iv = (ImageView)findViewById(R.id.logoImage);
if(_iv == null) {
  Log.e(PFApplication.DEBUG_TAG, "onAnimationEnd(Animation animation)");
}


Поскольку привык я в C++ к препроцессорным полезностям, в частности, условной компиляции, то это безобразие
хотелось заменить чем-то вроде

Код: Выделить всё

protected View findViewById(Activity activity, int resId) {
#ifdef _DEBUG_
View _v = activity.findViewById(resId);
if(PFApplication.DEBUG) {
  if (_v == null) {
    Log.e(PFApplication.DEBUG_TAG, String.format("error in %s with null-value for resource %x", activity.getClass().getName(), resId));
  }
return _v;
#else
return activity.findViewById(resId);
#endif
}
Так как в Java нет препроцессорной обработки, зато (говорят) есть умный компилятор, убирающий из байт-кода неисполняемые куски, пришлось сделать так

Код: Выделить всё

protected View findViewById(Activity activity, int resId) {
View _v = activity.findViewById(resId);
  if(PFApplication.DEBUG) {
    if (_v == null) {
      Log.e(PFApplication.DEBUG_TAG, String.format("error in %s with null-value for resource %x", activity.getClass().getName(), resId));
    }
  return _v;
}
static final boolean PFApplication.DEBUG при отладке выставлен в true, а при релизе - в false.

Теперь в коде я просто делаю так

Код: Выделить всё

ImageView _iv = (ImageView)findViewById(this, R.id.logoImage)
и в случае нулевого указателя еще до потока исключений получаю вменяемое сообщение типа

Код: Выделить всё

error in com.vfx.SplashActivity with null-value for resource 0f003027
с именем класса активности и идентификатором неправильного ресурса.
Удобно.

Ответить