Ответ 1
То, как я это делаю:
// in some.class.with.Constants
public static final boolean DEV_MODE = true;
// in some other class
import static some.class.with.Constants.DEV_MODE;
if(DEV_MODE){
Log.d('sometag', 'somemessage');
}
Я программирую приложения для Android, и лучший способ здесь может быть или не быть таким же, как Java вообще.
Я просто хочу установить флаг отладки, который будет выполнять только определенные части кода, когда он устанавливает значение true - equiv на С++, задает препроцессор #define DEBUG и использует #ifdef DEBUG.
Есть ли приемлемый или лучший способ выполнить это на Java?
Сейчас я просто установлю переменную в свой объект приложения, но я не думаю, что это лучший способ.
То, как я это делаю:
// in some.class.with.Constants
public static final boolean DEV_MODE = true;
// in some other class
import static some.class.with.Constants.DEV_MODE;
if(DEV_MODE){
Log.d('sometag', 'somemessage');
}
Вместо использования собственного флага вы можете автоматически использовать флаг, установленный ADT, например:
final static int appFlags = context.getApplicationInfo().flags;
final static boolean isDebug = (appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0
Бит FLAG_DEBUGGABLE
автоматически устанавливается в true или false, в зависимости от атрибута "отлаживаемый" приложения (установленного в AndroidManifest.xml). Последняя версия ADT (версия 8) автоматически устанавливает этот атрибут для вас, если вы не экспортируете подписанный пакет.
Таким образом, вам не нужно запоминать настройку/сброс собственного пользовательского флага.
Вы можете прочитать больше в этой теме.
В редакции 17 инструментов SDK (март 2012 г.) был введен способ имитации C #ifdef DEBUG
Из Общие примечания:
Добавлена функция, позволяющая запускать некоторый код только в режиме отладки. Builds теперь генерирует класс BuildConfig, содержащий константу DEBUG, которая автоматически устанавливается в соответствии с вашим типом сборки. Вы можете проверить константу (BuildConfig.DEBUG) в своем коде, чтобы запускать только функции отладки.
Это работает для меня с кодом if (BuildConfig.DEBUG)
, используя класс BuildConfig. Это безопасный и простой код. Будьте осторожны при использовании этого стиля кода. Не используйте его так, чтобы между версиями Release и Debug существовало 2 разных отдельных раздела кода. Если вы это сделаете, это может привести к недействительности тестирования приложения для версии Release. Для меня я использовал его, чтобы пропустить вызов Log
сообщений.
Подробнее об этом классе BuildConfig @Построить концепцию системы.
Я предлагаю использовать встроенный API андроида BuildConfig
if (BuildConfig.DEBUG) {
// do something for a debug build
}
if ( Debug.isDebuggerConnected() ) {
// debug stuff
}
Я считаю, что тесты на запись лучше альтернативы, чем добавление кода DEBUG.
Я хочу сказать, что когда вы пишете тест для какого-то компонента/метода/класса, вы не загрязняете исходный код каким-то избыточным кодом отладки.