Las constantes static
final
se comportan de forma diferente a los valores literales devueltos por un método. El compilador de Java también los usa en ciertos casos en tiempo de compilación.
Un ejemplo,
public static boolean DEBUG = false;
...
if (DEBUG)
{
...do something...
}
vs
public boolean debug()
{
return false;
}
...
if (debug())
{
...do something 2...
}
En el primer caso, la condición y hacer algo ... ... código no será incluido en el byte de código compilado (el archivo de clase). En el segundo caso, la condición y ... hacer algo 2 ... el código se incluirá pero nunca se ejecutará; sin embargo, el JIT puede hacer un análisis suficiente en este caso para eliminar el código en tiempo de ejecución.
En un momento, en los primeros días de Java, el JIT no existía o no era lo suficientemente inteligente como para optimizar el método simple que devuelve un valor literal. Entonces se necesitaba un valor constante para el rendimiento. También es más conveniente definir constantes de esta manera si se tiene en cuenta que las clases externas (para las constantes finales estáticas públicas/protegidas) tendrán el valor incorporado a ese código de bytes en tiempo de compilación; en lugar de obtener el valor de la clase fuente en tiempo de ejecución.
http://codebetter.com/raymondlewallen/2005/07/19/4-mayor-principles-of-object-oriented-programming/ – talnicolas
Tengo curiosidad por saber qué es el bytecode. Un método 'estático' que devuelve una variable' estática final' parece altamente optimizable. – Brian