¿Por qué no se proporciona una instancia singleton lista para usar en Java? [cerrado]

Puede hacer que la clase sea singleton implementando el patrón Singleton. Hoy en día, la clase singleton es un requisito básico.

¿Por qué JVM no maneja la creación de objetos Singleton por sí mismo en tiempo de ejecución?

Al tener una interfaz de marcador como "Singleton" y crear una instancia de objeto una vez por JVM en tiempo de ejecución. De todos modos, el compilador de Java agrega "objeto extendido" si la clase no está extendiendo ninguna otra clase. Se puede aplicar un enfoque similar en el caso Singleton. Esto ahorrará mucho tiempo y esfuerzo de desarrollo y discusiones sobre varias implementaciones del patrón Singleton.

1) getInstance() sincronizado

2) Bloque sincronizado dentro de getInstance() en lugar de sincronizar todo el método

3) Opción 2 con singleInstance como miembro volátil

Esto también ahorrará mucho tiempo y duplicará esfuerzos si necesita implementar un patrón singleton en varias clases (sin considerar la clase SingletonPatternFactory que devolverá una instancia singleton de cualquier clase que se haya pasado)

preguntado el 03 de mayo de 12 a las 18:05

Esto es subjetivo: voté para cerrar. Por cierto: siempre puedes implementar fácilmente un singleton usando una enumeración. -

La clase Singleton no es un requisito básico, debe tener mucho cuidado al crear una clase singleton. Porque una vez que hagas esa elección, no podrás cambiarla más tarde. -

Tal vez OP esté hablando de un singleton perezoso: esa es la única forma en que esos patrones de sincronización tendrían algún sentido. Por cierto OP, en la mayoría de las aplicaciones de la vida real, los contenedores IoC sirven mucho mejor a los singletons que a los lenguajes de Java. -

La razón es simplemente la simplicidad. Los métodos getInstance generados por el compilador parecerían bastante mágicos. -

No es un JVM problema, es un Java pierda. Scala (otro lenguaje que se ejecuta en JVM) tiene singletons como un concepto integrado, por lo que puede definir singletons como object Foo { ... } (a la par de las clases habituales class Foo { ... } que también son compatibles). -

5 Respuestas

Echemos un vistazo a todos los pasos necesarios para crear un singleton:

  1. constructor privado
  2. un campo final estático
  3. (opcional) si desea que la clase sea serializable, implementaciones triviales de readResolve y writeObject

La mayoría de los singletons con los que me he encontrado no se preocupan por la serialización, por lo que el tercer paso no es necesario. Esto te deja dos pasos muy, muy fáciles.

public class Whatever extends WhateverElse {
    public static final Whatever INSTANCE = new Whatever();

    private Whatever() {}
}

Incluso tiene carga diferida, ya que el constructor no se ejecutará hasta que acceda a la clase, que solo sería para obtener la instancia única de la misma. No sé cuál es su definición de "mucho" en cuanto a tiempo y esfuerzo de desarrollo, pero no considero que esto sea oneroso.

contestado el 03 de mayo de 12 a las 18:05

La implementación de patrones de diseño básicos no es responsabilidad del lenguaje central, a menos que exista una razón convincente para que así sea. Los patrones de diseño van y vienen; por ejemplo, el patrón singleton es ampliamente considerado como un patrón extremadamente malo que nunca debe usarse. Incluso si decide usarlo de todos modos, ¿quiere un singleton ansioso? ¿Singleton perezoso? ¿Qué debería suceder si la creación de instancias falla por algún motivo? Hay muchos problemas aparentemente menores que cubrir, pero agregar esta característica al lenguaje no es un cambio trivial.

Al implementarlo usted mismo, obtiene exactamente las características y el comportamiento que desea.

contestado el 03 de mayo de 12 a las 18:05

Puede usar una enumeración en lugar de un patrón singleton; esto no es muy complejo:

public enum Singleton {
    INSTANCE;
}

contestado el 03 de mayo de 12 a las 18:05

es un buen enfoque if no necesitas ninguna superclase. - daniel lubarov

@Daniel true: puede implementar la interfaz de la superclase si implementa una y si no necesita la implementación real de la superclase. - Assylias

Hay dos categorías básicas de Singletons, aquellos con inicialización diferida y aquellos con inicialización ansiosa.

Aparte de todo el argumento sobre los sabores de Singletons, muchos desarrolladores de Java consideran que los Singletons son malos o un antipatrón. Esta es probablemente un área de desacuerdo entre aquellos que actualmente mantienen la especificación de Java.

Por último, lo mismo podría decirse de la mayoría de los patrones. No hay una gran necesidad de que un idioma adopte o apruebe un conjunto específico de patrones, en mi humilde opinión.

contestado el 03 de mayo de 12 a las 18:05

No querría una interfaz Singleton, ya que la interfaz no tiene un comportamiento propio. Querrías una clase abstracta... más o menos. En realidad, querrías algo mucho más poderoso que solo un padre abstracto. Debe tener un constructor privado (o un método de creación de instancias privado que llame a un constructor privado y devuelva la instancia única) que debe llamarse en el método getInstance() definido en el padre (violación del alcance).

Lo que está sugiriendo es algo que funcionará fuera del sistema de clases tradicional. Tal vez se pueda hacer como un nuevo tipo de objeto (similar a cómo una enumeración no es una clase), pero definitivamente no como una interfaz o clase estándar.

contestado el 03 de mayo de 12 a las 18:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.