java - que - ¿Diferencia entre clase singleton y clase estática?
singleton c# (5)
Posibles duplicados:
¿Diferencia entre la clase estática y el patrón singleton?
¿Cuál es la diferencia entre un patrón Singleton y una clase estática en Java?
HI No entiendo claramente. ¿Cuál es la diferencia entre una clase singleton y una clase estática? ¿Alguien puede elaborar esto con el ejemplo?
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, dependiendo del idioma que utilice. 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 ese Singleton a través de un método de fábrica:
public class Example {
private static final Example SINGLETON = new Example();
public static Example getInstance() { return SINGLETON; }
private Example() { /* Constructor */ }
}
Usando esta técnica, puede hacer todo tipo de cosas sofisticadas: cargue el singleton de forma lenta, sustitúyalo por alguna subclase, administre la iniciación de singletons a través de la configuración, etc.
La diferencia no es la forma correcta de preguntar. Porque singleton no es una palabra clave en comparación con estática. debería preguntar como "¿Cuándo elegir cuál?". ¿Cuáles son las ventajas de la clase singleton sobre la clase estática? Estas preguntas surgen en las etapas de diseño.
Singleton: Uso: clases que sirven como configuración global, ej: versión de prueba de software con una conexión de base de datos, instancias de clases de JDK Runtime por jvm.
Cuándo ir: 1. Mientras desarrolla su código, piensa en la compatibilidad hacia adelante, como mañana, cuando necesite convertir esta clase singleton a una clase normal o permitir subclases. 2. Puede proporcionar una función de carga lenta, cuando esta clase de singleton es pesada.
static: Usage: clases que básicamente hacen conversiones, funciones de utilidad. Por favor, consulte la clase de matemáticas.
Cuándo ir: 1. clases de ayuda, utilizadas por todas las clases en el desarrollo de su API.
Desventaja: 1. Las clases se cargan con entusiasmo.
esperando puntos de otras personas.
Old que / ans en SO: ¿ Diferencia entre la clase estática y el patrón singleton?
Una clase estática es aquella que tiene solo métodos estáticos, para lo cual una palabra mejor sería "funciones". El estilo de diseño incorporado en una clase estática es puramente procedimental.
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.
Un 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 clase determinada se construye dentro de una única Máquina Virtual Java. Las implementaciones modernas del patrón singleton usan enumeraciones, por cierto. Las implementaciones más antiguas utilizan un constructor privado y almacenan la referencia a la instancia única en un campo estático.
Una clase estática es siempre una clase miembro que, en contraste con una clase interna, no tiene acceso a las variables de instancia de la clase circundante.
Ejemplo de clase estática
public class A {
public static class B {
}
public int notAccessibleForB;
public static int accessibleForB;
}
Patrón Singleton (estilo antiguo simple)
public final class Singleton {
public final static Singleton INSTANCE = new Singleton();
private Singleton(){}
}
Patrón Singleton (estilo moderno simple)
public enum Singleton {
INSTANCE;
}
Clase Singleton : Clase Singleton es una clase de la cual solo puede existir una instancia por cargador de clases.
Clase estática / auxiliar (clase con solo campos / métodos estáticos) : no existe ninguna 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 en este blog " Clases estáticas en Java " lo describe muy bien. El blog también tiene ejemplos para explicar lo mismo:
Ejemplo de Singleton :
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;
}
}
Ejemplo de clase estática :
/**
* 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é creo que la segunda solución es mejor para una clase que no quiere o no 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 crear una instancia de ninguna copia de la clase. La razón por la que no debería usar una clase Singleton es porque para esta clase auxiliar no usamos ninguna variable. La clase singleton sería útil si contuviera un conjunto de variables de las que solo queríamos un conjunto y los métodos utilizaron esas variables, pero en nuestra clase auxiliar no usamos ninguna variable aparte de las que se pasaron (que hacemos finales) . Por esta razón, no creo que queramos una instancia única porque no queremos ninguna variable y no queremos que nadie cree una instancia de esta clase. Entonces, si no quiere que nadie cree una instancia de la clase, que es normalmente si tiene algún tipo de clase helper / utils, entonces uso lo que yo llamo la clase estática, una clase con un constructor privado y solo consiste en métodos estáticos sin ningún tipo cualquier variable.
La misma respuesta también se menciona en mi respuesta here