Pregunta

No me refiero a los errores de compilación porque cometí un error de sintaxis o lo que sea.En C++ podemos crear errores de tiempo de compilación basados ​​en condiciones como en el siguiente ejemplo:

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;
}

En VS 2005 esto generará:

------ 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 ==========

¿Hay alguna manera de lograr esto en Java?

¿Fue útil?

Solución

No hay forma de hacer esto en Java, no de la misma manera que funciona en C++.

Quizás podrías usar anotaciones y ejecutar apto antes o después de la compilación para comprobar sus anotaciones.

Por ejemplo:

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

Y luego escriba su propio AnnotationProcessorFactory que busque anotaciones @MyStaticCheck y haga algo con los argumentos.

Nota:No he jugado mucho con apt, pero la documentación hace que parezca que esto es muy factible.

Otros consejos

No hay forma de producir acciones basadas en la lógica de tiempo de compilación en Java sin el uso de una herramienta separada.Técnicamente, es posible usar el preprocesador C en Java, pero habría que tener cuidado con sus suposiciones integradas sobre el lenguaje subyacente.Si yo fuera usted, encontraría una mejor manera de lograr lo que sea que esté intentando hacer con este error en tiempo de compilación.Si es necesario, incluso podría escribir su propio preprocesador (posiblemente usando APTO) si es realmente tan inevitable.

Como Matt Quail respondió anteriormente, las anotaciones, junto con XDoclet, son adecuados para satisfacer sus necesidades.Esas combinaciones permiten bastante preprocesamiento, generación de código, etc.

Aunque la pregunta se hizo hace algún tiempo, decidí publicar mi respuesta porque resolví (hasta cierto punto) un problema ligeramente similar.

Lo específico de mi tarea requiere que se creen dos aplicaciones con diferentes conjuntos de funciones a partir de una biblioteca de un solo núcleo (y que el material no utilizado no esté vinculado).La selección del conjunto de funciones se realiza mediante public static final boolean banderas.El problema es que quiero asegurarme de que cada una de las aplicaciones esté construida con un indicador adecuado establecido en la biblioteca principal.Y en el caso de que se habiliten funciones incorrectas, la aplicación no debería compilarse dando un error de tiempo de compilación.

La única solución que he encontrado hasta ahora es declarar en la biblioteca las variables finales junto con las banderas: public static final int functionSet1 = 0;, etc.

En el paquete de la aplicación agregué una clase ficticia con el chequeo

ConditionalBuild.functionSet1 = 1;

De todas las variables de functionSetX, solo una se convirtió en no definitiva en una compilación específica.Entonces, solo una aplicación puede pasar el proceso de compilación sin error.¿Existe una mejor manera de lograr esto?Por favor házmelo saber en los comentarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top