2010-05-14 17 views
17

Editar: Contestado - error fue el método no era estáticoJava Singleton patrón

Estoy acostumbrado al Singleton Design Pattern

public class Singleton { 
    private static final Singleton INSTANCE = new Singleton(); 

    // Private constructor prevents instantiation from other classes 
    private Singleton() {} 

    public static Singleton getInstance() { 
     return INSTANCE; 
    } 
} 

Mi pregunta es ¿cómo puedo crear un objeto de la clase Singleton en otra ¿clase?

He intentado:

Singleton singleton = new Singleton(); 
// error - constructor is private 
Singleton singleton = Singleton.getInstance(); 
// error - non-static method cannot be referenced from a static context 

¿Cuál es el código correcto?

Gracias, Spencer

+0

FYI, algunas personas evitar el uso de '' GET' aquí en getInstance() 'debido a la [convención de nomenclatura JavaBean] (http://en.wikipedia.org/wiki/JavaBeans#JavaBean_conventions) para las propiedades. Una alternativa sería 'instancia()'. –

Respuesta

26
Singleton singleton = Singleton.getInstance(); 

es la forma correcta. Asegúrese de que su método getInstance() sea realmente static.

Debido a que su aplicación Singleton está lejos de ser seguro - su objeto puede ser una instancia a través de la reflexión, es posible que desee crear un producto único basado en enum

+0

Eso es exactamente lo que hice, olvidé hacer el método estático. Gracias – Spencer

+0

No creo que haya que proteger el código para que no se abuse de él con la reflexión. Los que usan la reflexión (deberían) conocen los peligros. –

+2

@Bart van Heukelom teóricamente estoy de acuerdo contigo por completo. Pero desafortunadamente en la práctica esto a menudo no es verdad :) – Bozho

2

Ésta:

Singleton singleton = Singleton.getInstance(); 

debería funcionar. Así es como llamas a los métodos estáticos en Java. Y el método getInstance() se declara como static. ¿Estás seguro de que estás utilizando la misma clase de Singleton? O tal vez ha importado una clase llamada igual en algún otro paquete.

3

Singleton singleton = Singleton.getInstance(); debería funcionar - ese error no tiene sentido, dado su código; ¿Estás seguro de que estás informando correctamente? (Tendría sentido si hubiera olvidado hacer el método getInstance estático, que ha hecho en su código anterior.)

El código que nos ha dado para la clase es correcto.

Por último, una nota conceptual: En primer lugar, no está "creando un objeto de clase Singleton": ese es el objetivo de Singleton. :) Solo está obteniendo una referencia al objeto existente.

1

No hay nada malo en el uso de

Singleton singleton = Singleton.getInstance(); 
// error - non-static method cannot be referenced from a static context 

Ésta es la manera de conseguir el objeto singleton forman la clase. Debo hacerme otra cosa. Por favor, publique más detalles

2
  1. dado que el constructor es privado, no tiene sentido crear un objeto utilizando el constructor.
  2. debe utilizar public static Singleton getInstance(), pero la implementación no es muy correcta.

    if (instance == null) {
    instance = new Singleton();
    }
    return instance;

Esta es la forma en que debe hacerlo. Esto asegura que crea la instancia si no existe, o simplemente devuelve la instancia existente. Su código también haría lo mismo, pero esto se agrega a la legibilidad.

2

Como no queremos permitir el acceso a más de una copia. Por lo tanto, necesitamos instanciar manualmente un objeto, pero debemos mantener una referencia al singleton para que las llamadas subsiguientes al método del descriptor de acceso puedan devolver el singleton (en lugar de crear uno nuevo). Es por eso que es

Singleton singleton = Singleton.getInstance(); 

manera correcta para acceder a cualquier singletonObject.

0

ya que el método getInstance() es "estático" y el campo de instancia también, puede usar Singleton.getInstance(); Sin crear nuevos ejemplos de clase. Thihs es el Poit de Singletone

1

Todavía es posible crear más de una instancia de la clase, de la siguiente manera:

Singleton.getInstance().clone() 
Cuestiones relacionadas