2010-09-15 27 views
23

duplicados posibles:
Difference between static class and singleton pattern?
What is the difference between a Singleton pattern and a static class in Java?Diferencia entre clase simple y clase estática?

HI No estoy recibiendo con claridad cuál es la diferencia entre una clase Singleton y una clase estática? ¿Alguien puede elaborar esto con un ejemplo?

+5

Suena como un duplicado de http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern – oksayt

+1

No olvide marcar la respuesta como aceptada si obtuvo la información que desea .. –

+0

check http://stackoverflow.com/a/37114702/1406510 – nanosoft

Respuesta

4

Es la diferencia entre un patrón y cómo se implementa el patrón.

El patrón Singleton no está vinculado específicamente al lenguaje Java. Puede haber diferentes formas de convertir una clase en un singleton, según el idioma que use. Muchos lenguajes OO usan el equivalente de variables estáticas para hacer un singleton, pero otros pueden usar diferentes técnicas.

Además, algunas formas de implementar un singleton son mejores que otras. Una buena manera de implementar un Singleton es encapsular adecuadamente el acceso a esa Singleton a través de un método de fábrica:

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

    public Example getInstance() { return SINGLETON; } 

    private Example() { /* Constructor */ } 
} 

Usando esta técnica, se puede hacer todo tipo de cosas sofisticadas: lazy-cargar el único, reemplazarlo con algo subclase, gestione la iniciación de singletons a través de la configuración, y así sucesivamente.

+2

Si su método 'getInstance()' no es 'estático', ¿cómo debería un usuario potencial obtener una instancia de esta clase si necesitara tener una instancia para recibir uno? – winklerrr

1

A Singleton no es un tipo de clase, sino un patrón de diseño. Con Singleton usted (intenta) garantizar, que solo una instancia de una determinada clase se construye alguna vez dentro de una sola Máquina Virtual Java. Las implementaciones modernas del patrón singleton usan enumeraciones, por cierto. Las implementaciones más antiguas usan un constructor privado y almacenan la referencia a la única instancia en un campo estático.

A clase estática es siempre una clase miembro que, a diferencia de una clase interna, no tiene acceso a las variables de instancia de la clase circundante.


ejemplo de la clase estática

public class A { 
    public static class B {   
    }  
    public  int notAccessibleForB; 
    public static int accessibleForB; 
} 

patrón Singleton (viejo estilo sencillo)

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

patrón Singleton (estilo moderno sencillo)

public enum Singleton { 
    INSTANCE; 
} 
16

Que Viejo/ans de SO: Difference between static class and singleton pattern?

Una clase estática es aquella que tiene sólo métodos estáticos, para los que una palabra mejor sería "funciones". El estilo de diseño incorporado en una clase estática es puramente de procedimiento.

Singleton, por otro lado, es un patrón específico para el diseño OO.Es una instancia de un objeto (con todas las posibilidades inherentes a eso, como el polimorfismo), con un procedimiento de creación que garantiza que solo haya una instancia de ese rol en particular durante toda su vida.

16

Singleton Class: Singleton Class es una clase de la cual solo puede existir una sola instancia por classloader.

Clase estática/auxiliar (Clase con solo campos/métodos estáticos): No existe instancia de esta clase. Solo se puede acceder directamente a los campos y métodos como constantes o métodos auxiliares.

A continuación se hace referencia a partir de este blog "Static classes in Java" lo describe muy bien. El blog también tiene ejemplos para explicar misma:

Singleton ejemplo:

public class ClassicSingleton { 
    private static ClassicSingleton instance = null; 

    private ClassicSingleton() { 
     // Exists only to defeat instantiation. 
    } 

    public static ClassicSingleton getInstance() { 
     if (instance == null) { 
      instance = new ClassicSingleton(); 
     } 
     return instance; 
    } 
} 

clase estática ejemplo:

/** 
* A helper class with useful static utility functions. 
*/ 
public final class ActionHelper { 

    /** 
    * private constructor to stop people instantiating it. 
    */ 
    private ActionHelper() { 
     // this is never run 
    } 

    /** 
    * prints hello world and then the users name 
    * 
    * @param users 
    *   name 
    */ 
    public static void printHelloWorld(final String name) { 
     System.out.println("Hello World its " + name); 
    } 

} 

Entonces, ¿cuál es la diferencia entre los dos ejemplos y por qué piense que la segunda solución es mejor para una clase que no quiere o necesita crear una instancia. En primer lugar, el patrón Singleton es muy útil si desea crear una instancia de una clase. Para mi clase de ayuda no queremos realmente instanciar ninguna copia de la clase. La razón por la que no deberías usar una clase Singleton es porque para esta clase de ayuda no usamos ninguna variable. La clase singleton sería útil si contuviera un conjunto de variables de las que solo quisiéramos un conjunto y los métodos usaran esas variables, pero en nuestra clase de ayuda no utilizamos ninguna variable aparte de las pasadas (que hacemos finales) . Por esta razón, no creo que deseemos una instancia singleton porque no queremos ninguna variable y no queremos que nadie esté instantaneando esta clase. Entonces, si no quieres que nadie crea una instancia de la clase, que normalmente es si tienes algún tipo de clase auxiliar/utilitaria, entonces utilizo la que yo llamo la clase estática, una clase con un constructor privado y solo consiste en métodos estáticos sin ningún cualquier variable

La misma respuesta también se hace referencia desde mi respuesta here

+0

La reflexión de Java todavía se puede usar para romper la invariante de ninguna instancia para la "clase estática". Una [solución enum] (http://shamsmi.blogspot.com/2013/05/emptytons-mimicking-static-classes-in.html) aún conservaría la invariante. – shams

+0

¿Y por qué para vencer instancias? ¿Qué sucede si necesita argumentos de constructor para seguir una lógica y aún así mantener el resto estático? –

+0

En el ejemplo único, getInstance no es seguro para subprocesos, necesita ser sincronizado. – kecso

5

La diferencia no no es la forma correcta de ask.because Singleton es una palabra clave en comparación con estática. Deberías preguntar "¿Cuándo elegir cuál?". ¿Cuáles son las ventajas de la clase singleton sobre la clase estática? Estas preguntas se presentan en las etapas de diseño.

Singleton: Uso: clases que sirven de configuración global, por ejemplo: la versión de prueba de software con una conexión de base de datos, en tiempo de ejecución JDK clases de instancias por JVM.

Cuándo ir: 1.Mientras desarrolla su código, piensa en compatibilidad futura, como mañana cuando necesita convertir esta clase singleton a clase normal o permitir la creación de subclases. 2. Puede proporcionar la función de carga diferida, cuando esta clase singleton es pesada.

estática: Uso: clases que básicamente hace conversiones, funciones de utilidad. por favor revisa la clase de Matemáticas

Cuándo ir: 1. clases de ayuda, utilizadas por todas las clases en su desarrollo de API.

desventaja: 1. las clases se cargan con entusiasmo.

esperando puntos de otras personas.

Cuestiones relacionadas