2011-11-28 17 views
21

Me pregunto si hay si un equivalente de Java para Ccómo marcar el código de Java tal que no es compilado

#if 0 
... Some Code ... 
#endif 

que puede ser utilizado alrededor de bloques de código que no queremos compilar. Añadiendo citas de bloque:

/* 
... Some Code ... 
*/ 

también tiene el mismo efecto, pero el problema es, tenemos que garantizar que no haya una sola línea comenta

// some comment 

en el bloque.

+2

¿por qué tienes que asegurarte de que no hay '//' comentarios? - El '//' dentro de un comentario de bloque sigue siendo la sintaxis legal. tampoco hay ninguna razón por la que deba usar '#if 0 ...' en C. eso es lo que los comentarios de bloque son para – tobyodavies

+0

Para la segunda parte, si entiendo esto correctamente - ¿No se pueden usar las comillas de bloque para comentarios de línea única? ? –

+1

Relacionado: http://stackoverflow.com/questions/4526113/java-conditional-compilation-how-to-prevent-code-chunks-to-be-compiled – Thilo

Respuesta

8

No hay directivas de preprocesador en Java. Tu mejor opción es comentar el código.

2

No puedo ni siquiera empezar a imaginar por qué esto es un problema (como se describe) pero sospecho que lo más fácil es grep para // en el código antes de compilarlo (o enviarlo a su repositorio de versiones)) No creo que haya nada en eclipse (si eso es lo que estás usando) para ayudarte y estoy casi seguro de que Java no tiene un mecanismo incorporado como el que describes en C.

1

Vi esto en alguna parte hace un tiempo:

// /* 
class SomeClass{ 
    int withSomeField; 
    .............. 
} 
// */ 

y usted puede poner los // s y y eliminarlos según sea necesario. Sin embargo, es probable que los comentarios de líneas múltiples causen problemas si estuvieran allí.

4

hay varias soluciones:

  1. use el preprocesador - Creo que va a trabajar con el estándar de CPP. Hubo algunos proprocessors Java específicas como Jappo y java+ que puede probar

  2. Sustituir el #if 0 con un cierto si:

    si (false) {} código

El condición se puede refinar mediante la consulta de las propiedades del sistema:

if(System.getProperty("NO_COMPILE").equals("true")) { 
    code 
    } 

Esto tiene la ventaja th en él se puede configurar fácilmente desde ANT o desde Eclipse.

EDIT: Coméntelo con si el código realmente se compilará y estará presente en los archivos .class. Además, aunque consultar las propiedades del sistema es más elegante, se realiza en tiempo de ejecución no en tiempo de compilación, por lo tanto, no está del todo alineado con el requisito original. El if (falso) está en un 2do punto mejor.

Edit2: una solución aún mejor que simplemente han encontrado: http://prebop.sourceforge.net/

+0

ponerlo en un bloque if (falso) no funciona en eclipse. Por ejemplo, el siguiente da error de compilador (Tengo Project-> Build Automatically "ON"): if (false) {intentional;} lo que significa que se está compilando. –

+0

Correcto, esto es lo que dije en la primera edición. Incluso la solución con código de compilación WILL estático final. Eclipse NO DEBE dar errores, pero le advierte sobre el "código muerto". Si tiene errores, entonces es probable que algo esté mal en el bloque guardado por if (falso) –

23

static final campos pueden ser el uso para la compilación condicional.

static final boolean DEBUG = false; 

if (DEBUG) { 
    some code .... 
} 

some code será retirado por el compilador.

También es posible utilizar la palabra clave assert para habilitar y deshabilitar alguna parte del código. Use java -ea: .. para controlar si el código debe habilitarse o deshabilitarse. Ver http://docs.oracle.com/javase/1.5.0/docs/guide/language/assert.html

+0

¿Funciona esto solo si el final estático es un booleano? ¿Funcionará usando 'DEBUG' como un entero? – Pacerier

+1

@Pacerier No funciona para 'static final int's también, pero no' enum's. Comprobé con decompiler, las enumeraciones permanecen como están, pero sí, 'int's puede hacer referencia a otras' int's finales. Además 'switch-case' con' int's no hacen la magia, es decir, plain 'if ... else if ...' escaleras ¡Esta debería haber sido la respuesta! – zeropoint

+0

@zeropoint, ¿Sin embargo, las especificaciones garantizan que esto sería de hecho tiempo de compilación? – Pacerier

1

if (falso) funciona bien para mí (usando Eclipse).

+3

¿Puedes dar un argumento sobre * por qué * esto no está compilado? – alestanis

+0

AFAIK, esto está compilado. Entonces no puedes tener errores de código dentro del bloque 'if'. He intentado con el booleano final estático DONT_COMPILE = false' y luego con 'if (! DONT_COMPILE) {}'. Esto también todavía compila el código en el bloque 'if'. –

1

sólo puede utilizar Java preprocesador y supongo que será mejor manera que las banderas http://code.google.com/p/java-comment-preprocessor/ banderas de curso permiten cortar y añadir bloques en la fase de compilación, pero preprocesador permite que el proceso sea mucho más flexible

-1

En lugar de tratar de hacer que el código sea condicional preprocesando el código fuente (como C lo hace), use programación orientada a objetos: use patrones de diseño como Estrategia e inyección de dependencia para hacer que el código sea condicional.

Cuestiones relacionadas