Cómo inicializar un campo de objeto constante de una clase en Java

Mohsen R. Aqdam:

Me pregunto cuál es la mejor manera de inicializar un campo constante del tipo de objeto complejo para una clase, que uno tiene el máximo rendimiento?

1) inicialización Inline

public class TopClass {
   private static final ComplexObject sdf = new ComplexObject();
            
   public TopClass (
   }
}

2) métodos inicializador

public class TopClass {
     private static final ComplexObject sdf = initializeComplexObject();
     private static ComplexObject initializeComplexObject(){
                return sdf == null ? new ComplexObject() : sdf;
     }
     public TopClass (
     }
}

3) La inicialización de constructores, 4) estático inicializador bloques o lo otro enfoque sugieres ...

¿El SDF inicializa cada vez que la nueva clase TopClass está creando? Quiero campo sdf única initialize una vez en la vida útil de la aplicación.

Andy Turner:

Rendimiento de inicializadores estáticos casi no tiene importancia (especialmente para tal inicialización trivial), ya que se hace una sola vez para una clase.

2) Este enfoque método específico es redundante, ya que se invoca inmediatamente cuando se inicializa la clase; sdfes siempre nula cuando el inicializador estático invoca ese método, y no lo hace invocar ese método de nuevo (al menos, no con el propósito de dar sdfun valor diferente). También es bastante viscosa porque esté leyendo intencionalmente un campo final sin inicializar.

Por lo tanto, basta con retirar el condicional, y se termina de vuelta con eficacia la línea inicializador de enfoque, con el direccionamiento indirecto de una invocación de método.

El enfoque método sería útil si, por ejemplo, que quería hacer otra configuración en el formateador, para el establecimiento de una zona horaria ejemplo.

3) ¿Los miembros no estáticos de inicialización en un constructor. Los constructores son para inicializar los miembros de instancia.

En particular, esto requiere que usted haga del campo estático no final. Esto significa que usted entonces tiene que preocuparse acerca de la visibilidad de cambios en el campo, con el fin de evitar múltiples hilos inicializar el campo porque ven un valor nulo

4) La inicialización de un campo en su declaración es simplemente una abreviatura para declarar un inicializador estático. El primer bloque de código en la pregunta es semánticamente idéntica a ésta:

private static final ComplexObject sdf;

static {
  sdf = new ComplexObject(); 
}

No hay ninguna ventaja en hacer esto de forma explícita, si usted puede conseguir lejos con no.

inicializadores estáticos son una especie de como los métodos anónimos. prácticas Java internos de Google recomiendan el uso de métodos en lugar de estática explícita inicializador bloques siempre que sea posible, en parte porque se puede invoquen expresamente para las pruebas, sino también debido a que forzosamente le obligan a inicializar un solo campo. (Estoy de acuerdo en gran medida este es un buen consejo, pero tenga en cuenta que se pierde la comprobación de la asignación definitiva de los métodos - como se ha demostrado anteriormente - que puede ayudar a atrapar a ciertos tipos de error).

En conclusión: el uso private static final ComplexObject sdf = new ComplexObject();, ya que no es necesario nada más complicado.


El problema mucho más grande aquí es correcto, es decir, garantizar que sdfno se comparte entre hilos: antes de editar la pregunta, sdfera una SimpleDateFormat, que no es seguro para subprocesos. No tengo idea de lo que ComplexObjectes, pero es necesario asegurarse de que o bien es seguro para subprocesos, o que se accede de un modo seguro para subprocesos. Preocuparse por cosas como que antes de micro-optimizaciones.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=332530&siteId=1
Recomendado
Clasificación