Мой обычный подход к этому является:
Отдельные из кода, который использует дополнительную библиотеку в другой исходный каталог. Он должен реализовывать интерфейсы и обычно зависит от основного каталога источника.
Чтобы обеспечить соответствие зависимостей в сборке, скомпилируйте основной каталог источника без дополнительной библиотеки, а затем источник, который зависит от дополнительной библиотеки (с другим файлом класса из другого исходного каталога и библиотеки на пути к классу компилятора) ,
Основной источник должен попытаться загрузить один корневой класс в дополнительном исходном каталоге динамически (Class.forName
, asSubclass
, getConstructor
, newInstance
). Статический intialiser корневого класса должен проверять, действительно ли библиотека доступна, и выдает исключение, если это не так. Если корневой класс не загружается, возможно, следуйте за шаблоном Null Object.
Что означает 'доступные'? Вы загружаете их через отражение? –
Я пишу библиотеку для Android. Начиная с Android 1.5 существует класс AsyncTask, который я бы хотел использовать, если он доступен, в противном случае я бы хотел использовать не-родной класс, который делает то же самое. Я бы предпочел родной, поскольку он (предположительно) будет поддерживаться. –