2011-01-15 12 views
9

Vi algunos códigos en slf4j como se muestra a continuación. No sé por qué evitar el plegado constante aquí. ¿Es necesario hacer eso? o simplemente la mejor práctica. ¿Cuál es el beneficio de hacer esto?¿por qué evitar el doblado constante en Java? ¿Cuando?

Gracias.

/** 
    * Declare the version of the SLF4J API this implementation is compiled against. 
    * The value of this field is usually modified with each release. 
    */ 
// to avoid constant folding by the compiler, this field must *not* be final 
public static String REQUESTED_API_VERSION = "1.6"; // !final** 
+0

¿Has visto el wiki sobre este tema? Creo que lo explica bastante bien. http://en.wikipedia.org/wiki/Constant_folding – CoolBeans

+0

Puede usar un método en lugar de exponer este campo (probablemente el mejor), use 'final' pero pase el valor a través de un método (' "1.6" .toString() ') o agregue algún código para evitar que sea una * constante de tiempo de compilación * pero no agregue ningún bytecode innecesario ('null! = null?" ":" 1.6 "'). –

+0

¡Sí, las constantes estáticas públicas son repulsivas! –

Respuesta

6

En el caso particular en el que está liberando una biblioteca, que a menudo no tienen el control de la versión final de la biblioteca de registro que está vinculado con el tiempo al final. Por ejemplo, está utilizando la versión 1.6, y la aplicación que está usando su biblioteca podría usar 1.6.1 para obtener una corrección de errores. Como solo es una versión de punto, la API debería ser compatible, pero si su biblioteca inspecciona la versión de SLF4J, debería mostrar 1.6.1 no 1.6.

Si la constante está enlineada, verá 1.6 (ya que está copiada en su archivo de clase), incluso si la biblioteca se actualiza después del hecho.

+0

Un proyecto en el que solía trabajar, AviSynth, descubrió esto por las malas cuando extendieron su ABI entre versiones menores. No fue posible debido a demasiada inclusión y demasiada dependencia de VC6. La siguiente versión principal utilizó un ABI "virtual" y funcionó de maravilla. – SilverbackNet

Cuestiones relacionadas