2011-12-27 10 views
5

Tengo una clase singleton.Acceda a los campos de Singleton a través de un método estático

Al acceder a los métodos de la clase, tengo la opción de dos posibilidades.

  1. crear esos métodos como instancia específica y luego obtener la instancia y las invoquen
  2. crear esos métodos como estáticos e invocan ellos y sus hijos recibirán la instancia

Por ejemplo:

Class Test{ 

private int field1; 

Test instance; 

private Test(){}; 

private Test getInstance(){ 
    if (instance == null) 
     instance = new Test(); 
    return instance; 
} 

public int method1() { return field1;} 
public static int method2() {return getInstance().field1;} 
} 

Ahora, en otro lugar puedo escribir

int x = Test.getInstance().method1(); 
int y = Test.method2(); 

¿Qué es mejor? Puedo pensar en una tercera alternativa donde uso "instancia" directamente en el método estático y luego capturar la excepción si es nula e instanciarla y luego volver a invocarla.

Podría, en teoría, simplemente hacer que el lote estético. Sin embargo, esto me creará problemas al guardar el estado en la actividad cerrada ya que la serialización no guarda estática.

+0

Iré con 'Test.method2();' ya que transmite el hecho de que 'method2()' es un método estático. – TheVillageIdiot

Respuesta

2

Creo que el primero es más limpio.

Sin embargo, tenga en cuenta que, en algunos casos extremos, Android puede matar sus instancias estáticas. Ver esto, por ejemplo: http://code.google.com/p/acra/.

Una solución alternativa que he encontrado en alguna parte para esto, es mantener también una referencia a su singleton de la clase Application. Sin embargo, no sé cuán a prueba de problemas es esto.

+0

Cuando dice "matar", supongo que está hablando de la actividad que se cierra. – theblitz

+1

No, estoy hablando de la destrucción de instancias estáticas. No debe sorprenderse cuando mueren las actividades, debe sorprenderse mucho cuando mueren las instancias estáticas, no ocurre en Java. – zmbq

2

Debe evitar que todo sea estático. Algunas personas incluso dirían que un singleton no está hecho.

+0

Tiene que ser un singleton porque lo necesito de una gran cantidad de lugares y debe ser el mismo. – theblitz

+0

Luego debe ir con "int x = Test.getInstance(). Method1();" solución, ya que field1 no es estático en absoluto. – ChristopherS

0

En mi opinión personal tener métodos estáticos es un mal diseño en primer lugar. Por supuesto, depende del programa en sí, pero permitir que una clase tenga un método estático tendrá un impacto en todo el diseño. Algunos razonamiento detrás de mi declaración:

  1. Si método estático puede cambiar fácilmente el estado de un objeto, más pronto o más errores posteriores surgirá
  2. Si publica método estático con su programa, cada cliente que va a usar tendrá una muy fuerte dependencia de tu código. Si decide eliminar o cambiar este método algún día, romperá todos los clientes que usaron su clase.

Por lo tanto, si puede - evitarlo.

Si, por alguna razón, insistirás en tener un método estático, supongo que la primera solución es mejor. Así es como debería funcionar Singleton. Debería obtener una referencia a OBJETO SINGLETON mediante el método estático, pero este objeto debería ser y luego utilizarse según todos los principios de Programación orientada a objetos.

+0

(1) Por supuesto, los métodos estáticos solo deben usarse para operaciones que no cambian el estado de los objetos, pero esa no es una razón para prohibir completamente los métodos estáticos. (2) Esta es una crítica a todos los métodos públicos, no solo a los estáticos. ¡Hay un límite de hasta dónde puedes desacoplar dos clases sin perder la interacción por completo! –

2

El objetivo de la patrón singleton es que se puede cambiar la aplicación . En la mayoría de los casos, lo usa para mantener la posibilidad de "conectar" en algunas otras implementaciones de esta funcionalidad más adelante.

Lea: cuando decida a favor del plan singleton para un método setInstance también, no solo para un getInstance. - Si esto no tiene sentido, solo usa una clase estática simple.

Por otro lado, los singletons están fuera de temporada, si quieres estar a la moda y todo eso. Realice una búsqueda para "eliminando el estado global". También hay algunas charlas patrocinadas por Google al respecto. En resumen: su código será más comprobable y le ayudará a evitar un caos de dependencia. (Además de ser cadera y todo, definitivamente es un paso en la dirección correcta).

Cuestiones relacionadas