2012-02-19 11 views
12

En Java, se utiliza el bloque de inicialización estática:¿Es la inicialización estática una buena práctica de programación?

private static final ApiKey API_KEY; 

static { 
    API_KEY = new ApiKey(); 
} 

Me preguntaba que

  • ¿Es una buena práctica de programación?
  • ¿Dónde deberíamos usar este patrón?

Gracias de antemano.

+1

comentaré porque no hay respuesta "negro o blanco" a su pregunta. Personalmente, no encuentro el acceso estático un buen amigo de los programadores.La inyección de dependencia es una alternativa muy buena que también ayuda mucho cuando se trata de pruebas. –

+1

He visto un código donde se inician nuevos hilos en el bloque estático. :) Fue muy malo. –

Respuesta

9

Hasta cierto punto es una cuestión de gusto. Para mí es bien siempre y cuando:

  • A mantener la final de campo, como lo han hecho
  • Usted asegúrese de que el objeto referenciado es inmutable y seguro para subprocesos

estática tiende a hacer que la escritura buenas pruebas más difíciles. Si alguna vez encuentra que desea comenzar a modificar el estado estático, entonces probablemente deba volver a mirar el diseño.

Considere la posibilidad de mirar Google Guice y es muy agradable Singleton implementation.

Por supuesto, si su aplicación es un experimento de una sola línea de 10 líneas, entonces esto importa mucho menos.

Tenga en cuenta que en su ejemplo, puede simplificar a:

private static final ApiKey API_KEY = new ApiKey(); 

eso no siempre es posible, sin embargo. ¿Quizás ha omitido algún código de inicialización más complejo? En cuyo caso, Guice volvería a merecer la pena.

3

Se puede evitar el uso de un bloque inicializador estático completamente utilizando el siguiente código:

private static final ApiKey API_KEY = new ApiKey(); 

o

private static final ApiKey API_KEY = createNewApiKey(); 

si la creación de claves API requiere algo más que una llamada al constructor. Eso hace que el código sea más legible, en mi humilde opinión. Pero no importa mucho.

El inicializador estático es útil cuando dos campos estáticos dependen del mismo código de inicialización:

static { 
    // compute some values 
    A = somePartOfTheComputedValues(); 
    B = someOtherPartOfTheComputedValues(); 
} 

Pero incluso entonces, A y B podrían tal vez refactorizan en un único objeto, que se creó en una sola método.

2

Me gusta usar enums siempre que sea posible.

En lugar de

class ApiKey {   
    private static final ApiKey API_KEY; 

    static { 
     API_KEY = new ApiKey(); 
    } 

me gustaría escribir

enum ApiKey { 
    INSTANCE; 
Cuestiones relacionadas