Да, вы можете сделать это.На самом деле есть несколько способов.(Примечание: единственная часть этого ответа, относящаяся к Android, - это способ определения версии платформы.)
Предположим, что класс X
имеет метод void y()
в версии 2.0 и выше, но не раньше.
Один из способов вызвать этот метод без введения каких-либо зависимостей времени компиляции - использовать отражение, чтобы найти метод и вызвать invoke
для него.Например:
X x = ...
if (BUILD.VERSION.RELEASE.compareTo("2.0") >= 0) {
// (exception handling omitted ...)
Method m = c.getClass().getDeclaredMethod("y");
m.invoke(x);
}
Другим способом является создание API-интерфейса адаптера совместимости версий для вашего приложения, например:
/** Version compatibility adapter API */
interface Compat {
void doY();
}
/** Adapter class for version 1 */
class CompatV1 {
public void y(X x) {
// do nothing
}
}
/** Adapter class for version 2 */
class CompatV2 {
public void y(X x) {
x.y();
}
}
//
// Code to instantiate the relevant adapter for the current platform.
//
Class<?> compatClass;
// (Exception handling omitted)
if (BUILD.VERSION.RELEASE.compareTo("2.0") < 0) {
compatClass = Class.forName("...CompatV1");
} else {
compatClass = Class.forName("...CompatV2");
}
// (Exception handling omitted)
Compat compat = (Compat) compatClass.newInstance();
// The adapter object can be passed around as a parameter, wrapped
// as a singleton or injected using dependency injection.
// Invoke X.y() as follows:
X x = ...
compat.y(x);
Вторая версия выглядит немного тяжелой, но имеет свои преимуществачто динамический (медленный, не типобезопасный) код выполняется только один раз, и что код, зависящий от версии, изолирован от остальной части кода.В реальной жизни вы, вероятно, добавили бы несколько методов в интерфейс адаптера.
Этот подход требует немного больше размышлений, чтобы разработать интерфейс API совместимости, чтобы он четко изолировал зависимости версий от остальной части кода.Возможно, вам также придется пересмотреть API-интерфейс адаптера и создать новые классы адаптеров для каждого нового (несовместимого) основного выпуска.
Наконец, если API-интерфейс платформы изменится, вам нужно будет адаптировать его для использования классов или методов вЕсли в более старой версии удалены , то в более новой версии вам потребуется скомпилировать различные классы адаптеров (например, классы CompatV*
), используя разные Android SDK.Это значительно усложнит процессы сборки.
Чтобы узнать о других проблемах, прочитайте следующие статьи в блоге Android: