Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

Esta es una publicación traducida por IA.

제이온

[Effective Java] Artículo 3. Garantiza un singleton con un constructor privado o un tipo de enumeración

Seleccionar idioma

  • Español
  • English
  • 汉语
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

Texto resumido por la IA durumis

  • Un singleton es una clase que solo puede crear una instancia, que se utiliza para crear objetos sin estado o componentes únicos del sistema.
  • Hay tres métodos para crear un singleton: un miembro público static que es un campo final, proporcionar un método de fábrica estático, y usar un tipo de enumeración; el método de tipo de enumeración es el más adecuado.
  • Al serializar una clase singleton, debes implementar Serializable, declarar todos los campos de instancia como transient y sobrescribir el método readResolve().

Singleton

El concepto de Singleton

Un Singleton es una clase que solo puede crear una instancia. Un ejemplo típico de Singleton es un objeto sin estado o un componente de sistema único. Sin embargo, las clases Singleton son difíciles de probar si no se definen por tipo como una interfaz y se definen como su implementación.


Cómo crear un Singleton

Método en el que el miembro static es un campo final


public class Elvis {

    public static final Elvis INSTANCE = new Elvis();

    private Elvis() {
    }

    public void speak() {
        System.out.println("elvis");
    }


El constructor privado se llama solo una vez cuando se inicializa la instancia de Elvis, lo que garantiza que sea la única instancia en todo el sistema. Sin embargo, se puede llamar al constructor privado usando AccessibleObject.setAccessible(), pero este método de modificación usando reflexión se puede prevenir lanzando una excepción cuando se crea el segundo objeto.


  • Ventajas
    • Es obvio en la API que la clase es Singleton.
    • Es conciso.


Método que proporciona un método de fábrica estático público

public class Elvis {

    private static final Elvis INSTANCE = new Elvis();

    private Elvis() {
    }

    public static Elvis getInstance() {
        return INSTANCE;
    }

    public void speak() {
        System.out.println("elvis");
    }


Este método también garantiza que sea la única instancia en todo el sistema, excepto por modificaciones usando reflexión. El campo se cambia a private y el método de fábrica estático se usa para devolver el objeto.


  • Ventajas
    • Se puede cambiar a no Singleton sin cambiar la API.
      • Por ejemplo, se puede configurar para que el método de fábrica estático devuelva diferentes instancias por hilo.
    • Se puede cambiar a un método de fábrica de Singleton genérico si se desea.
    • Se puede usar una referencia de método de fábrica estática como proveedor.
      • Por ejemplo, en lugar de Elvis::getInstance, se puede usar Supplier<Elvis>.


Si no necesitas usar las ventajas anteriores, es mejor usar el primer método.


Método usando un tipo de enumeración

public enum Elvis {

    INSTANCE;

    public void speak() {
        System.out.println("elvis");
    }


El método más recomendable es usar un tipo de enumeración. Es más seguro contra los ataques de reflexión y el código es más limpio que los dos métodos anteriores. Además, como se explica más adelante, los dos métodos anteriores tienen la desventaja de que se debe agregar código adicional al serializar.

Sin embargo, debes tener en cuenta que si bien es posible que el Singleton que deseas crear herede una interfaz, no puede heredar una clase.


Puntos a tener en cuenta al serializar una clase Singleton

Si quieres serializar una clase Singleton creada usando el primer o segundo método, debes implementar Serializable además de declarar todos los campos de instancia como transient y redefinir el método readResolve() para proporcionarlo.


private Object readResolve throws ObjectStreamException {
    return INSTANCE;


Fuentes

제이온
제이온
제이온
제이온
[Effective Java] Item 5. Utilice la inyección de dependencia en lugar de especificar recursos Si una clase depende de recursos externos, es mejor no usar singletons ni clases de utilidad estáticas. La inyección de dependencia puede mejorar la flexibilidad, la reutilización y la facilidad de prueba de la clase, y el uso del patrón de método de fábr

28 de abril de 2024

[Effective Java] Item 4. Use a private constructor to prevent instantiation Las clases de utilidad que contienen solo métodos y campos estáticos deben configurar el modificador de acceso de su constructor como privado para evitar la creación de instancias. Esto evita que los usuarios asuman que el constructor es generado automáti

28 de abril de 2024

[Java] Concepto y uso de la reflexión La reflexión es una API que admite el acceso a la información de clase durante la ejecución de un programa Java para permitir la manipulación de la clase. En tiempo de ejecución, se pueden crear clases y acceder a campos y métodos, pero dado que puede vio

25 de abril de 2024

Modelado de datos conceptual El modelado de datos conceptual es el proceso de separar las entidades y representar la relación entre las entidades como ERD. Una entidad es una unidad de información independiente, y un atributo es la data que posee la entidad. El identificador identifi
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

8 de abril de 2024

[Next.js] Inyección de entorno de tiempo de ejecución Descubre cómo configurar variables de entorno en Next.js después del tiempo de compilación. Te mostramos cómo instalar cross-env y modificar los scripts para que los usuarios de Windows también puedan seguirlos fácilmente. Este método se puede utilizar pa
Sunrabbit
Sunrabbit
Sunrabbit
Sunrabbit

20 de marzo de 2024

[python] Fundamentos de Python 1: Introducción a los Módulos de Python En este artículo, se describe la migración de un programa desarrollado en PHP a Python, incluyendo los conceptos básicos de Python y el uso de módulos. Python es un lenguaje de script que admite el tipeo dinámico y es independiente de la plataforma. Ofrec
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

27 de marzo de 2024

[No técnico, sobrevivir como desarrollador] 9. Sitios web adecuados para crear un portafolio Se presentan tres tipos de sitios web que son adecuados para que los estudiantes de becas o bootcamps los creen como portafolios de empleo. Puedes desarrollar groupware, ERP, sistemas internos de recursos humanos, etc. que se utilizan comúnmente en las em
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

30 de marzo de 2024

[Concurrencia] Operación atómica: Memory Fence y Memory Ordering Esta publicación de blog explica cómo tener en cuenta el orden de la memoria en las operaciones atómicas y la importancia de las opciones de ordenación. Se explica en detalle las diversas opciones de ordenación, como Relaxed, Acquire, Release, AcqRel y Se
곽경직
곽경직
곽경직
곽경직
곽경직

12 de abril de 2024

Crear una CLI genial con Rust Este artículo explica cómo implementar aplicaciones CLI con Rust. Utilizaremos las bibliotecas clap y ratatui para crear un programa CLI que incluya funciones de inicio de sesión y cierre de sesión. Cubriremos todos los aspectos del desarrollo de CLI basa
곽경직
곽경직
곽경직
곽경직
곽경직

13 de marzo de 2024