Произведите условную ошибку времени компиляции в Java - PullRequest
0 голосов
/ 18 сентября 2008

Я не имею в виду ошибки компиляции, потому что я сделал синтаксическую ошибку или что-то еще. В C ++ мы можем создавать ошибки времени компиляции на основе условий, как в следующем примере:

template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};

#define STATIC_CHECK(expr, msg) { CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }

int main(int argc, char* argv[])
{
    STATIC_CHECK(false, Compile_Time_Failure);
    return 0;
}

В VS 2005 это выдаст:

------ Build started: Project: Test, Configuration: Debug Win32 ------
Compiling...
Test.cpp
f:\temp\test\test\test.cpp(17) : error C2079: 'ERROR_Compile_Time_Failure' uses undefined struct 'CompileTimeError<__formal>'
        with
        [
            __formal=0
        ]
Build log was saved at "file://f:\temp\Test\Test\Debug\BuildLog.htm"
Test - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Есть ли способ достичь этого в Java?

Ответы [ 4 ]

2 голосов
/ 18 сентября 2008

Нет никакого способа сделать это в Java, не так, как это работает у вас в C ++.

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

Например:

@MyStaticCheck(false, "Compile Time Error, kind-of")
public static void main(String[] args) {
    return;
}

А затем напишите свой собственный AnnotationProcessorFactory, который ищет аннотации @MyStaticCheck и что-то делает с аргументами.

Примечание: я не слишком много играл с apt, но из документации видно, что это очень выполнимо.

2 голосов
/ 18 сентября 2008

Невозможно произвести какие-либо действия, основанные на логике времени компиляции, в Java без использования отдельного инструмента. Технически, возможно использовать препроцессор C на Java, но вы должны быть осторожны с его встроенными предположениями о базовом языке. Если бы я был тобой, я бы нашел лучший способ выполнить то, что ты пытаешься сделать с этой ошибкой во время компиляции. При необходимости вы могли бы даже написать свой собственный препроцессор (возможно, используя APT ), если это действительно так неизбежно.

0 голосов
/ 21 июня 2012

Хотя вопрос был задан некоторое время назад, я решил опубликовать свой ответ, потому что решил (в определенной степени) немного похожую проблему.

Специфика моей задачи требует, чтобы два приложения с различным набором функций были собраны из одной базовой библиотеки (и неиспользуемые вещи не должны быть связаны). Выбор набора функций осуществляется с помощью флагов public static final boolean. Проблема заключается в том, что я хочу убедиться, что в каждом приложении он построен с соответствующим флагом, установленным в базовой библиотеке. А в случае, если включены неправильные функции, приложение не должно компилироваться, что приводит к ошибке времени компиляции.

Единственное решение, которое я нашел, - это объявить в библиотеке окончательные переменные вместе с флагами: public static final int functionSet1 = 0; и т. Д.

В пакете приложения я добавил фиктивный класс с проверкой

ConditionalBuild.functionSet1 = 1;

Из всех переменных functionSetX только одна сделана не финальной при конкретной сборке. Таким образом, только одно приложение может пройти процесс сборки без ошибки. Есть ли лучший способ добиться этого? Пожалуйста, дайте мне знать в комментариях.

0 голосов
/ 18 сентября 2008

Как ответил Мэтт Квейл выше, аннотации вместе с XDoclet подходят для удовлетворения ваших потребностей. Эта комбинация позволяет выполнять небольшую предварительную обработку, генерацию кода и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...