2009-04-08 11 views
20

En Java, ¿cuándo se deben utilizar variables estáticas no finales?Práctica recomendada: variables estáticas no finales de Java

Por ejemplo

private static int MY_VAR = 0; 

Es evidente que no estamos hablando de las constantes aquí.

public static final int MY_CONSTANT = 1; 

En mi experiencia he menudo los justificado cuando se utiliza un producto único, pero luego terminan necesidad de tener más de una instancia y causar un gran dolor de cabeza y yo re-factorización.

Parece que es raro que se utilicen en la práctica. ¿Qué piensas?

Respuesta

21

La recopilación de estadísticas puede utilizar variables no finales, p. contar el número de instancias creadas. Por otro lado, para ese tipo de situación, probablemente desee utilizar AtomicLong, etc. de todos modos, en cuyo punto puede ser final. Alternativamente, si está recopilando más de una estadística, podría terminar con una clase Statistics y una referencia final a una instancia de la misma.

Es bastante raro tener (justificadamente) variables estáticas no finales.

+0

+1, pero usa Atomics. Teniendo en cuenta que es "estático", supongamos que accederá a varios subprocesos. –

6

Cuando se usa como memoria caché, el registro, las estadísticas o un interruptor de depuración son los usos lógicos obvios. Todo privado, por supuesto.

Si tiene un objeto mutable asignado a un campo final, eso es moralmente lo mismo que tener un campo mutable.

Algunos lenguajes, como Fan (Ventilador), no permiten totalmente las estáticas mutables (o equivalentes).

+0

http://code.google.com/p/noop/ tampoco tiene estática alguna – Eduardo

2

En mi experiencia, las variables estáticas no finales solo deben usarse para instancias singleton. Todo lo demás puede ser contenido de forma más limpia por un singleton (como un caché) o finalizado (como una referencia de registrador). Sin embargo, no creo en las reglas duras y rápidas, así que tomaría mi consejo con un grano de sal. Dicho esto, sugeriría examinar cuidadosamente cualquier caso en el que considere declarar una variable estática no final aparte de una instancia singleton y ver si puede ser refactorizada o implementada de manera diferente, es decir, trasladada a un contenedor único o usar una referencia final a un mutable objeto.

0

Creo que envolver sus estáticas y proporcionar acceso a través de singletons (o como mínimo a través de métodos estáticos) es una buena idea, ya que puede controlar mejor el acceso y evitar problemas de sincronización y condición de carrera.

0

Una variable estática significa que está disponible para la clase como un todo, por lo que ambos ejemplos están disponibles para la clase como un todo. Final significa que el valor no se puede cambiar. Así que supongo que la pregunta es cuándo quieres que un valor esté disponible para una clase completa y no se puede cambiar después de haber sido instanciado. Mi conjetura sería una constante disponible para todas las instancias de esa clase. De lo contrario, si necesita algo así como un contador de población, entonces la variable no final.

1

Las variables estáticas se pueden utilizar para controlar el comportamiento del nivel de la aplicación, por ejemplo, especificando el nivel de registro global, servidor con el que conectarse.

He encontrado casos de uso en aplicaciones antiguas, por lo general procedentes de otras empresas.

Hoy en día el uso de variables estáticas para tales fines es obviamente mala práctica, pero no fue tan obvio en, digamos, 1999.Sin Spring, sin log4j, sin código de limpieza de R.C.Martin, etc.

El lenguaje Java es bastante antiguo ahora, e incluso si alguna característica se desaconseja ahora, a menudo se usaba en los comienzos. Y debido a la compatibilidad con versiones anteriores, es poco probable que cambie.

0

Personalmente para las variables no finales de clase utilizo la notación CamelCase. Del código se desprende que es una variable de clase, ya que debe hacer referencia a ella como tal: FooBar.bDoNotRunTests.

En ese sentido, prefijo las variables de instancia de clase con this para distinguirlas de las variables de ámbito local. ex. this.bDoNotRunTests.

Cuestiones relacionadas