2011-12-02 17 views
6

estoy usando el controlador Java para mongodb, y la documentación dice que:Creación de una referencia estática frente a un conjunto unitario

"se debe crear una única instancia de Mongo, y se puede utilizar en todas las solicitudes."

El uso de una sola instancia suena como un singleton.

En otros lugares para una biblioteca diferente He leído las instrucciones que dicen que debería crear una referencia estática, ya que es seguro para subprocesos.

Puede alguien explicar las diferencias entre un producto único y la creación de una referencia estática?

Así que el código real que necesito para crear una instancia de forma estática o por medio de un conjunto unitario sería:

Mongo m = new Mongo("localhost" , 27017); 

¿Puede alguien explicar ambos métodos y las diferencias subyacentes en su caso?

Respuesta

2

Singleton es un patrón de diseño donde se tiene una instancia de un objeto compartido entre el resto de su código. Las variables estáticas son una característica del lenguaje Java .

Con el fin de implementar un Singleton, que normalmente sería utilizar variables estáticas.

3

Tienes 3 cuestiones: Singleton, de referencia estáticos e hilo de seguridad.

Usted tiene un producto único si sólo se puede crear una instancia de una clase. Eso es útil ya que las cosas se complicarían si tuvieras dos instancias de Mongo corriendo. Sin embargo, no puede implementar el patrón de diseño singleton para Mongo en su código: puede llamar al new Mongo() en cualquier lugar que desee y crear tantas instancias como desee. Solo debes tener cuidado de no hacerlo, pero no debería ser muy difícil.

Para poner en práctica un conjunto unitario, el diseñador de la clase será muy a menudo utilizar una referencia estática de la siguiente manera:

public class MyClass { 
    private static final MyClass SINGLETON = new MyClass(); 

    private MyClass() {...} // !!private, not accessible 

    public MyClass getSingleton() { return SINGLETON; } 
} 

Y estará a sólo tienen una única instancia de MyClass ya que el constructor es privado y la única manera de obtener una instancia es a través de MyClass.getSingleton(). Obviamente, el diseñador de Mongo habría tenido que diseñar la clase Mongo como tal; no hay nada que puedas hacer para que sea un singleton.

En lo que se refiere a hilos de seguridad, no lo bastante ver el enlace con Singleton. Una clase singleton debe estar protegida contra subprocesos: si muchos subprocesos cambian y leen el estado de un singleton, necesita una sincronización adecuada para asegurarse de que todos los subprocesos vean los mismos valores. No conozco a Mongo, pero apostaría a que es una clase segura para subprocesos.

+0

Mongo es seguro para subprocesos, y tiene un grupo de conexiones, solo necesito crear una sola instancia de él, entonces una instancia estática es el camino a seguir, entonces? – codecompleting

+2

@codecompleting Sí, en algún lugar de su clase principal que se ocupa de Mongo debe tener 'static static final Mongo mongo = new Mongo (" localhost ", 27017);' y asegúrese de no crear otro Mongo. Si tiene un buen diseño de objetos, otras clases nunca accederán a 'mongo' directamente; si necesitas otras clases para acceder a 'mongo', puedes hacer un método' getMongo() 'en tu clase principal. – toto2

0

utilizar el patrón Singleton en un objeto si sólo desea estar pasando en torno a una sola instancia de este objeto a otros objetos y métodos que necesitan utilizar este solo ejemplo. Use una referencia estática si solo desea usar la clase del objeto estáticamente (es decir, como una referencia estática).

0

Si solo una clase usa su objeto singleton, no hay diferencia visible en la cantidad de objetos creados.

Asumiendo que requiere un objeto de classASing utilizando el enfoque Singleton

ClassASing { 
    private static ClassASing obj = new ClassASing(); 
    private ClassAsing(){...} 
    public static ClassASing getNewObject(){ 
      return obj; 
    } 
} 

Aplicando un enfoque de Singleton

ClassB{ 
    private ClassASing singObj = ClassASing.getNewObject(); 
} 
  • no importa cuántas instancias de ClassB creados todos ellos van a utilizar el mismo objeto de ClassASing

usando la referencia estática rencia

ClassB{ 
    private static ClassA sObj = new ClassA(); 
} 

* no importa cuántas instancias de ClassB creados todos ellos va a utilizar la misma referencia que apunta al mismo objeto.

No hay mucha diferencia aquí 1 objeto que se utiliza en ambos casos.

Ahora, si considera otro sencario que necesita objeto en dos de sus clases.

enfoque Singleton

ClassB1{ 
      private ClassASing singObj1 = ClassASing.getNewObject(); 
     } 

ClassB2{ 
      private ClassASing singObj2 = ClassASing.getNewObject(); 
     } 
  • no importa cuántas instancias de ClassB1 creó todos ellos van a utilizar el mismo objeto de ClassASing
  • no importa cuántas instancias de ClassB2 creados todos ellos habrá utilizando el mismo objeto de ClassASing que ClassB1 ya está utilizando tan sólo un objeto de ClassASing

enfoque de referencia estáticos

ClassB1{ 
    private static ClassA sObj1 = new ClassA(); 
} 

ClassB2{ 
    private static ClassA sObj2 = new ClassA(); 
} 
  • no importa cuántas instancias de ClassB1 creados todos ellos va a utilizar la misma referencia sobj1 apuntando al mismo objeto
  • no importa cuántas instancias de ClassB2 creados todos ellos va a utilizar el misma referencia sobj2 que apunta al mismo objeto, pero este objeto es diferente del creado en ClassB1 por lo que ahora tiene dos objetos de ClassA.
+0

perdónenme por los errores de sintaxis :) – Sudeep

Cuestiones relacionadas