2009-12-17 2 views
20

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

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

+2

Если вы просто обеспокоены тем, что входит в ваши баночки файлы (то есть, производство, не разработка), ваша система сборки (например, Ant) - это место, где вы можете контролировать, какие файлы создаются. – jdigital

+0

Спасибо, я вижу. Условная компиляция (вроде) достаточно проста, но, по-видимому, не существует встроенной поддержки нескольких целей в проекте в Eclipse. Я пойду прочитаю об Анте. –

ответ

3

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

+0

+1 для упоминания класса реализации – extraneon

1

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

private static final int MODE = ${mode}; 

... 

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

} 

Теперь вам нужно добавить свойство к вашему Maven ПОМ под названием «режим», который должен быть одного и того же значения, что и ваш ANDROID константы.

Компилятор java должен (!) Удалить блок if и else, тем самым оставив код android.

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

+3

Это действительно не подходит для значительного количества кода. Java имеет интерфейсы, реализации и наследование для подобных проблем. – extraneon

+0

Согласовано. Вот почему я сказал, что предпочитаю конфигурацию. – whiskeysierra

1

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

+2

У Java есть другие ответы на те же проблемы. Если вам приходится возиться с файлами для такого рода наиболее распространенных проблем, вы действительно делаете что-то не так в дизайне. – extraneon

+1

Обратите внимание на запрос OP: * [I] есть способ ввести в проект разные наборы конфигурации, а затем скомпилировать немного другой код на основе этих данных? * Чтобы «скомпилировать немного другой код», нужно передать другой исходный код компилятору , Да, я читал о статическом финальном булевом трюке, но я не думаю, что это то, что было после OP. – seh

0

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

  • Main (содержит общий код)
  • Version1 (содержит version1 код)
  • Version2 (содержит version2 код)

    1. Главная - > Выберите Project-> Properties-> Java Build Path-> Project tab
    2. Выберите Добавить ...
    3. Добавить «Версия1» xor «Версия2» и ОК вернуться в рабочее пространство.

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

import org.mycustom.Version; 

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

+0

Но разве вам не нужно поддерживать несколько копий исходного кода только с отдельными деталями, которые отличаются? – Pacerier

14

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

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

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

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

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

+0

Ты, ты забыл на самом деле сделать переменную финал .... – Erhannis

+1

Hardcore Java критика http://programmers.stackexchange.com/a/7049/24257 .... – Pacerier

+0

@Pacerier - спасибо за ссылку - как за критику я также обнаружил, что в выпуске книги, которую я купил, было исправлено несколько вопросов (некоторые из примеров кода, например, были «не в порядке») - и я думаю, что хорошие люди должны смотреть книгу критика - но я просто хочу указать всем, кто читает это сообщение, что конкретный механизм, описанный об «условной компиляции» (как и в случае с большой книгой), по-прежнему звучит. – monojohnny

6

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

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 
+0

Но разве это не означает, что нам нужно поддерживать несколько копий исходного кода? – Pacerier

+0

нет, только условный часть. Я написал это 5 лет назад. Я бы использовал хорошее «старое» утверждение if. – Pierre

+0

Хм, но для этого нужно условно обрабатывать условную часть с исходным кодом, так эффективно ли у нас две копии исходного кода? – Pacerier

5

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

+0

это приятная особенность, о которой я до сих пор не слышал. – Joel

+1

Это действительно не так знаменито, потому что на рынке с открытым исходным кодом присутствует очень много доминирующих игроков. Но я нашел это чрезвычайно полезным, учитывая тот факт, что вы не хотите использовать полномасштабные контейнеры IOC и просто хотите загрузить различную реализацию одного и того же интерфейса. – Shamik

+1

Это не сработает для него, поскольку его целью является BlackBerry, J2ME. –

1

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

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

Вы также должны проверить IoC и Observer Pattern для получения более подробной информации.

5

Если вы хотите, чтобы это специально для BlackBerry, то BlackBerry JDE имеет a pre-processor:

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

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

Затем вы можете сделать что-то в коде, как:

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

Для получения дополнительной информации см Specifying preprocessor defines

+0

URL-адрес потускли, может быть, именно эта одна: http://www.blackberry.com/knowledgecenterpublic/livelink.exe/fetch/2000/348583/1407892/How_To_-_Use_the_preprocessor.html?nodeid=1487658&vernum=0 - http://rzr.online.fr/q/preprocessor – RzR

+1

URL-адреса должны быть изменены. Я обновил ссылки. –

Смежные вопросы