Как я могу условно удалить часть моего приложения во время компиляции / выполнения? - PullRequest
1 голос
/ 12 ноября 2010

У меня есть приложение Java, которое работает на встроенном устройстве.Поскольку на разных устройствах используются разные версии SDK для устройств, я должен создать из ~ 5 разных комбинаций SDK для устройств.

Одна из этих комбинаций не поддерживает определенный метод для существующего объекта и полностью исключает другой объект из SDK.

Я использую этот метод и объект в моей программе, но только в определенной конфигурации, поэтому я хотел бы просто вернуться к другой конфигурации на устройствах, которые ее не поддерживают.

Я бы хотелс удовольствием сделаем это резервное поведение во время компиляции или выполнения.

Что будет самым простым способом условно удалить этот код?

Код в остальном идентичен, поэтому я бы предпочел не создавать дваотдельные ветви кода для двух SDK.

Я создаю свое приложение, используя скрипт Ant.

Мое приложение должно собираться на основе довольно старой версии JDK (1.1.8 / 1.2)если это актуально.

Ответы [ 2 ]

2 голосов
/ 12 ноября 2010

@ Записки Лоуренса Джонстона для самостоятельного ответа, как это сделать во время сборки.Я думаю, что это в основном правильная идея, но вы, вероятно, не хотите, чтобы плагин API генерировал проверенные исключения.В идеале вы хотите, чтобы реализации для более старой платформы предпринимали «максимальные усилия» для выполнения запрошенной функции.

Если вы хотите принять решение во время выполнения, вы можете:

  • Поместите разные версии класса в отдельные файлы JAR и используйте скрипт-обертку для включения соответствующих JAR-файлов в путь к классу приложения.

  • используйте Class.forName() для динамической загрузки версиикласса, соответствующего платформе.

В любом случае необходимо убедиться, что базовые классы приложений (предназначенные для работы на всех платформах) не зависят статическина любом из более продвинутых SDK / JDK.

Наконец, я был бы склонен отказаться от поддержки древних версий Java.Они были «истощены» много лет назад, и требование поддержать их явно сдерживает вас.Например, требование обратной совместимости в вашем основном приложении означает, что оно не может использовать множество новых функций, добавленных в последние выпуски Java.Сколько ваших клиентов все еще используют эти древние версии Java?Почему они не могут обновить свою платформу?Им действительно нужна последняя версия вашего приложения?

2 голосов
/ 12 ноября 2010

Одна из идей состоит в том, чтобы создать два класса с одним и тем же интерфейсом, полной реализацией и заглушкой, оба с методом isSupported (), а все остальные методы в заглушке генерируют исключение UnsupportedOperationException.Тогда я мог бы условно включить правильный класс во время компиляции в свой скрипт Ant.

Я решил пойти с этим, а не с более динамичным подходом @Stephen C, потому что он отлично работает для наших целей и нашего доступа к устройству(включая файловую систему устройства) весьма ограничен, что затрудняет развертывание нескольких jar-файлов, установку путей к классам и т. д.

В итоге я сделал следующее:

  1. Перемещение классовкоторые требуют заглушки в отдельный пакет.
  2. Создайте новый каталог mypackagenamestub и скопируйте в него файлы для вставки.Убедитесь, что ваша IDE не изменяет объявления пакетов для файлов, которые должны быть вставлены.
  3. Мы уже установили свойство пути SDK в нашем скрипте Ant на основе того, на каком SDK строилось приложение, поэтому я добавил еще одинсвойство omit.unsupportedmode (перефразировано) и установите его в true, где это необходимо.
  4. Используйте условную задачу, чтобы задать значение для передачи атрибуту exclude javac, например, **/MyPackageStub/** или **/MyPackage/** на основена omit.unsupportedmode.
...