Patrón de diseño Singleton, acceso estático no estático?

Pienso en un patrón de diseño Singleton común:

public class Singleton{

   private static Singleton instance;

   private Singleton(){}

   public static Singleton getInstance(){

    if(instance==null)
       instance=new Singleton();

   return instance;

   }
}

Hasta donde yo sé, los costructores son métodos NO estáticos porque pueden usar la referencia de contexto "esto" (que está prohibido en contextos estáticos). Por otro lado, los miembros estáticos solo pueden acceder a miembros estáticos.

Entonces, ¿cómo es posible que el miembro estático getInstance () esté accediendo al constructor del miembro no estático?

Respuesta 1

Cuando vea una creación de objeto como new Singleton()debe distinguir el newoperador del código del constructor o para ser más preciso el código inicializador.

El newoperador es " como " una llamada de método estático. No necesita una instancia de un objeto, porque crea uno.

El código del constructor es más " similar " a un método de instancia, excepto que no tiene ningún tipo de retorno. Pero puede acceder a la thisreferencia.

Al menos verás la diferencia cuando te sumerjas en el bytecode generado. El newoperador conducirá a esta instrucción de bytecode.

NEW yourpackage/Singleton

Esta instrucción solo crea el objeto en la memoria. Ver jvms-6.5.new

Una vez creado el objeto, se inicializa ejecutando el código de inicializador. En el bytecode se ve así:

INVOKESPECIAL yourpackage/Singleton.<init> ()V 

El código inicializador es más que solo el código constructor. Invoca el inicializador de la superclase e inicializa los campos de instancia.

Consulte también la especificación 2.9 de la máquina virtual de Java

A nivel de la máquina virtual Java, cada constructor escrito en el lenguaje de programación Java (JLS §8.8) aparece como un método de inicialización de instancia que tiene el nombre especial. Este nombre es proporcionado por un compilador. Como el nombre no es un identificador válido, no se puede usar directamente en un programa escrito en el lenguaje de programación Java. Los métodos de inicialización de instancias solo pueden invocarse dentro de la máquina virtual Java mediante la instrucción invokespecial (§invokespecial), y pueden invocarse solo en instancias de clase no inicializadas. Un método de inicialización de instancia toma los permisos de acceso (JLS §6.6) del constructor del que se deriva

Respuesta: 2

Estoy usando Quartz para crear regularmente un montón de trabajos que envié a una cola (RabbitMQ) donde son recogidos y ejecutados por actores Akka. Una pieza que falta es el monitoreo del trabajo. Si un trabajo ...

¿Hay alguna manera de definir objetos en hibernate.cfg.xml por alcance y no uno por uno? Por ejemplo, en Spring puede definir todos los controladores mediante dicha anotación: <contexto: componente-scan base-package = ...

Tengo un proyecto maven multimódulo y quiero que todos mis submódulos utilicen el complemento maven-compiler especificado en root pom.xml. Dónde debería colocar la declaración de plugin maven-compiler (en root pom ...

Tengo una GUI compuesta de algunos JPanels. Quiero usar métodos de fábrica para la creación de instancias de JPanels. Aquí hay un diagrama UML que muestra lo que quiero hacer: En pocas palabras, el método de fábrica debe usar ...