Условная компиляция Java

Я - давний программист на C++, плохо знакомый с Java. Я разрабатываю проект Blackberry Java в Eclipse. Вопросом - является там способ представить различные конфигурации модели в рамках проекта и затем скомпилировать немного отличающийся код на основе тех?

В Visual Studio у нас есть конфигурации проекта и #ifdef; я знаю, что нет никакого #ifdef в Java, но возможно чем-то на уровне файла?

20
задан Kevin Panko 17 December 2009 в 18:51
поделиться

10 ответов

В JDK6 это можно сделать с помощью интерфейса Java ServiceLoader. Проверьте это здесь .

6
ответ дан 29 November 2019 в 23:33
поделиться

Помимо Maven, Ant и других инструментов сборки, которые обеспечивают аналогичную функциональность, лучше создавать интерфейсы на Java и переключать реализации во время выполнения.
См. Шаблон стратегии для получения дополнительных сведений.

В отличие от C / C ++, это не повлечет за собой большого ущерба производительности, поскольку JIT-компилятор Javas оптимизируется во время выполнения и может встраивать эти шаблоны в большинстве случаев .
Большим плюсом этого шаблона является гибкость - вы можете изменить базовую реализацию, не касаясь основных классов.

Вы также должны проверить IoC и шаблон наблюдателя для получения дополнительных сведений.

1
ответ дан 29 November 2019 в 23:33
поделиться

Если вы хотите это специально для BlackBerry, BlackBerry JDE имеет препроцессор :

Вы может включить предварительную обработку для вашего приложений, обновив Eclipse ™ файл конфигурации.

В C: \ Program Files \ Eclipse \ configuration \ config.ini, добавьте следующую строку: osgi.framework.extensions = net.rim.eide.preprocessing.hook Если вы включите предварительную обработку после того, как есть сборка, вы должны очистить проект из меню "Проект" до вы собираете проект снова.

Затем вы можете делать что-то в коде, например:

//#ifdef SOMETHING
// do something here
//#else
// do something else
//#endif

Подробнее см. Указание препроцессора определяет

6
ответ дан 29 November 2019 в 23:33
поделиться

Можно ли назвать это бедным человеком ifdef : http://www.javapractices.com/topic/TopicAction.do?Id=64 ?

4
ответ дан 29 November 2019 в 23:33
поделиться

вы можете управлять разными путями к классам, например, реализовывать каждое «действие» в наборе отдельных каталогов:

dir1/Main.java
dir2/Action.java
dir3/Action.java

затем использовать разные пути к классам для каждой версии

javac -sourcepath dir1 -cp dir2 dir1/Main.java

или

javac -sourcepath dir1 -cp dir3 dir1/Main.java
6
ответ дан 29 November 2019 в 23:33
поделиться

Вы можете настроить поля 'final' и ifs, чтобы заставить компилятор оптимизировать скомпилированные байтовые коды.

...
public static final boolean myFinalVar=false;
...
if (myFinalVar) { 
 do something ....
 ....
}

Если 'myFinalVar' ложно, когда код компилируется, 'сделайте что-нибудь .... 'бит будет пропущен из скомпилированного класса. Если у вас более одного условия - это можно немного привести в порядок: переместите их все в другой класс (скажем, «Config.myFinalVar»), и тогда все условия можно будет хранить в одном аккуратном месте.

Этот механизм описан в "Hardcore Java".

[На самом деле я думаю, что это тот же механизм, что и в "ifdef для бедняков", опубликованном ранее.]

16
ответ дан 29 November 2019 в 23:33
поделиться

Нет, Java не имеет точного соответствия для этой функциональности. Вы можете использовать аспекты или контейнер IOC для внедрения различных классов реализации.

3
ответ дан 29 November 2019 в 23:33
поделиться

Вы можете интегрировать m4 в свой процесс сборки, чтобы эффективно связать аналог препроцессора C перед компилятором Java. На этапе "интеграции" много размахивают руками, но m4 - правильная технология для работы по обработке текста.

1
ответ дан 29 November 2019 в 23:33
поделиться

Вы можете использовать фильтрацию ресурсов maven в сочетании с общедоступными статическими конечными полями, которые действительно будут скомпилированы условно.

private static final int MODE = ${mode};

...

if (MODE == ANDROID) {
    //android specific code here
} else {

}

Теперь вам нужно добавить свойство в свой maven pom под названием "mode" , который должен быть того же значения, что и ваша константа ANDROID.

Компилятор java должен (!) удалить блоки if и else, таким образом оставив ваш код Android.

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

1
ответ дан 29 November 2019 в 23:33
поделиться

В eclipse вы можете использовать несколько проектов

  • Главная (содержит общий код)
  • Версия 1 (содержит код версии 1)
  • Версия 2 (содержит код версии 2)

    1. Главное -> Выбрать проект-> Свойства-> Путь сборки Java-> вкладка «Проекты»
    2. Выберите Добавить ...
    3. Добавить «Версия1» xor «Версия2» и OK обратно в рабочую область.

Версия1 и Версия 2 содержат одинаковые файлы, но разные реализации. В Main вы обычно пишете, например,

import org.mycustom.Version;

И если вы включили проект Version1 / Version2 в качестве ссылки, он будет компилироваться с файлом Version.java из проекта Version1 / Version2.

0
ответ дан 29 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: