2010-01-15 18 views
5

acabo de ver una clase (un módulo API grande), donde hay un montón de cosas por el estilojava: ¿está utilizando una estática final int = 1 mejor que solo una 1 normal?

readParamString(Object params, int index) 

y tienen en esa clase 10 campos

final static int PARAM1 = 1 
... 
final static int PARAM10 = 10 

que están siendo utilizados con funciones readParam

pero también se puede utilizar un int normal como readParamString(o, 1);

es int static final de alguna manera mejor t Han usando una int normal?

Respuesta

1

Al declarar int final estática tendrá una sola referencia a la variable int. Y una cosa más importante es que no puede cambiar el valor de int una vez declarado final. Si int no es final, entonces puede cambiar el valor de la variable. Entonces, si no quiere cambiar, cambie el valor de la variable a través de un código, entonces puede usar la static int final.

+5

incoherente mucho? –

+0

Ninguno de estos elementos es apropiado para int literales en Java, excepto si el valor constante significa algo (que se indicaría con un nombre como 'NUMBER_OF_WOGGLES_IN_A_BOGGLE' en oposición a' PARAM1') – Injektilo

1

sí de alguna manera mejor que el uso normal de un int

Pero Si está utilizando Java 5 o posterior enum es mejor que final static variables.

+0

El enfoque "static final int" sigue siendo útil si desea codificar múltiples valores en un único entero utilizando una codificación en caliente (mediante lo cual, bit a bit O los diferentes valores juntos). – Adamski

+0

En este caso específico, la estática final es completamente inútil. – jarnbjo

+2

@Adamski: para un enfoque OO real, recomendaría un 'EnumSet' en lugar del antiguo enfoque O bit a bit. –

15

Una de las ventajas de declarar una constante final estática es evitar las referencias múltiples al mismo valor literal a lo largo del código, lo que podría conducir a una variación no deseada; p.ej. si un programador cambia inadvertidamente un literal sin cambiar los otros.

En su ejemplo, cuestionaría el valor de declarar un PARAM1 constante con el valor 1, especialmente si esto es privado para la clase contenedora y solo se hace referencia una vez. Sin embargo, si hubiera algún significado semántico para el valor literal, entonces podría ser más útil; p.ej.

public static final int LOAD_ACTION = 1; 
public static final int SAVE_ACTION = 2; 
public static final int DELETE_ACTION = 4; 
public static final int MOVE_ACTION = 8; 

Sin embargo, por lo general una enumeración sería utilizado en lugar de este enfoque.

+2

¿Pero y si el valor de 1 cambia? –

+0

@John: Mi punto es que si PARAM1 solo se usa en un lugar en código privado para la clase, entonces tiene poco valor definirlo. El uso excesivo de constantes finales estáticas puede hacer que el código sea ilegible en mi humilde opinión. – Adamski

+2

+1, los números mágicos en el código siempre se deben definir con un nombre semántico significativo para que sean legibles. – Paolo

-2

Tal vez sea porque la variable está escrita por el compilador.

4

En el ejemplo que das, yo diría que tener los valores nombrados no es mejor que simplemente usar el int directamente. El parámetro es un recuento, por lo que la representación int del parámetro es tan descriptiva como la versión nombrada.

esto parece ser algo así como cuando de vez en cuando encuentro con código C que tiene cosas como

#define ZERO 0 
#define ONE 1 

No hay realmente no tiene mucho sentido. De hecho, cuando veo esos nombres usados ​​(en lugar de cuando estoy mirando las definiciones), me tienta saltar a las definiciones para asegurarme de que los nombres no mienten (Ha pasado mucho, mucho tiempo, pero, De hecho, he encontrado un código que tenía FALSO definido en 1, -1 o algo distinto de cero, por ejemplo, que es realmente, realmente malo).


Editar: en el segundo aspecto, parece que los nombres pueden indicar qué campo en el primer parámetro que son de interés, en cuyo caso los nombres podrían tener más sentido - siempre que los nombres tienen algún lazo significativa al campo en lugar de solo el desplazamiento numérico. Es difícil decir si ese es el caso, ya que podrías parafrasear el código con el que realmente estás trabajando.

9

Eso es tonto.

La razón para extraer las constantes numéricas es darles un nombre revelador. PARAM1 ... PARAM10 no son muy reveladores.

+0

+1. Otra razón podría ser hacer un seguimiento de las referencias y ser capaz de mantenerlas en un solo lugar. Pero un nombre significativo hubiera sido mejor allí también. – Thilo

+0

Tenga en cuenta que los nombres tontos pueden tener un único propósito, es decir, poder documentar su uso con JavaDoc. –

1

Creo que no está hecho para la variable estática final, sino para tener nombres reveladores. Y por eso incluso PARAMETER1 es más revelador que solo 1. Por lo tanto, puede mejorar la comprensión al leer el código.

Cuestiones relacionadas