Я - давний программист на C++, плохо знакомый с Java. Я разрабатываю проект Blackberry Java в Eclipse. Вопросом - является там способ представить различные конфигурации модели в рамках проекта и затем скомпилировать немного отличающийся код на основе тех?
В Visual Studio у нас есть конфигурации проекта и #ifdef; я знаю, что нет никакого #ifdef в Java, но возможно чем-то на уровне файла?
В JDK6 это можно сделать с помощью интерфейса Java ServiceLoader. Проверьте это здесь .
Помимо Maven, Ant и других инструментов сборки, которые обеспечивают аналогичную функциональность, лучше создавать интерфейсы на Java и переключать реализации во время выполнения.
См. Шаблон стратегии для получения дополнительных сведений.
В отличие от C / C ++, это не повлечет за собой большого ущерба производительности, поскольку JIT-компилятор Javas оптимизируется во время выполнения и может встраивать эти шаблоны в большинстве случаев .
Большим плюсом этого шаблона является гибкость - вы можете изменить базовую реализацию, не касаясь основных классов.
Вы также должны проверить IoC и шаблон наблюдателя для получения дополнительных сведений.
Если вы хотите это специально для 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
Подробнее см. Указание препроцессора определяет
Можно ли назвать это бедным человеком ifdef
: http://www.javapractices.com/topic/TopicAction.do?Id=64 ?
вы можете управлять разными путями к классам, например, реализовывать каждое «действие» в наборе отдельных каталогов:
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
Вы можете настроить поля 'final' и ifs, чтобы заставить компилятор оптимизировать скомпилированные байтовые коды.
...
public static final boolean myFinalVar=false;
...
if (myFinalVar) {
do something ....
....
}
Если 'myFinalVar' ложно, когда код компилируется, 'сделайте что-нибудь .... 'бит будет пропущен из скомпилированного класса. Если у вас более одного условия - это можно немного привести в порядок: переместите их все в другой класс (скажем, «Config.myFinalVar»), и тогда все условия можно будет хранить в одном аккуратном месте.
Этот механизм описан в "Hardcore Java".
[На самом деле я думаю, что это тот же механизм, что и в "ifdef для бедняков", опубликованном ранее.]
Нет, Java не имеет точного соответствия для этой функциональности. Вы можете использовать аспекты или контейнер IOC для внедрения различных классов реализации.
Вы можете интегрировать m4 в свой процесс сборки, чтобы эффективно связать аналог препроцессора C перед компилятором Java. На этапе "интеграции" много размахивают руками, но m4 - правильная технология для работы по обработке текста.
Вы можете использовать фильтрацию ресурсов maven в сочетании с общедоступными статическими конечными полями, которые действительно будут скомпилированы условно.
private static final int MODE = ${mode};
...
if (MODE == ANDROID) {
//android specific code here
} else {
}
Теперь вам нужно добавить свойство в свой maven pom под названием "mode" , который должен быть того же значения, что и ваша константа ANDROID.
Компилятор java должен (!) удалить блоки if и else, таким образом оставив ваш код Android.
Не тестировать, поэтому нет никаких гарантий и я бы предпочитают конфигурацию вместо условной компиляции.
В eclipse вы можете использовать несколько проектов
Версия 2 (содержит код версии 2)
Версия1 и Версия 2 содержат одинаковые файлы, но разные реализации. В Main вы обычно пишете, например,
import org.mycustom.Version;
И если вы включили проект Version1 / Version2 в качестве ссылки, он будет компилироваться с файлом Version.java из проекта Version1 / Version2.