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

Ceci est un post traduit par IA.

제이온

[Effective Java] Item 3. Garantir un singleton avec un constructeur privé ou un type énuméré

Choisir la langue

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

Texte résumé par l'IA durumis

  • Un singleton est une classe qui ne peut être instanciée qu'une seule fois, utilisée pour créer des objets sans état ou des composants système uniques.
  • Il existe trois méthodes pour créer un singleton : utiliser un membre public statique qui est un champ final, fournir une méthode d'usine statique ou utiliser un type énuméré. La méthode utilisant un type énuméré est la plus souhaitable.
  • Lors de la sérialisation d'une classe singleton, vous devez implémenter Serializable, déclarer tous les champs d'instance comme transient et redéfinir la méthode readResolve().

Singleton

Le concept de Singleton

Un singleton est une classe qui ne peut être instanciée qu'une seule fois. Un exemple typique de singleton est un objet sans état ou un composant système unique. Cependant, les classes singleton sont difficiles à tester si elles ne sont pas définies comme une interface et leur implémentation.


Comment créer un singleton

Méthode utilisant un membre public static final


public class Elvis {

    public static final Elvis INSTANCE = new Elvis();

    private Elvis() {
    }

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


Le constructeur privé est appelé une seule fois lors de l'initialisation de l'instance Elvis, garantissant qu'il s'agit de la seule instance dans l'ensemble du système. Cependant, vous pouvez utiliser AccessibleObject.setAccessible() pour appeler le constructeur privé, mais cette méthode de modification par réflexion peut être empêchée en lançant une exception lorsque le deuxième objet est créé.


  • Avantages
    • Il est clair dans l'API que la classe est un singleton.
    • Concis.


Méthode fournissant une méthode de fabrique statique publique

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");
    }


Sauf modification par réflexion, cette méthode garantit également qu'il s'agit de la seule instance dans l'ensemble du système. Il suffit de rendre le champ privé et d'utiliser une méthode de fabrique statique pour renvoyer l'objet.


  • Avantages
    • Il est possible de modifier la classe pour qu'elle ne soit plus un singleton sans changer l'API.
      • Par exemple, vous pouvez faire en sorte que la méthode de fabrique statique renvoie des instances différentes pour chaque thread.
    • Vous pouvez le modifier en une méthode de fabrique de singleton générique si vous le souhaitez.
    • Une référence de méthode de fabrique statique peut être utilisée comme fournisseur.
      • Par exemple, vous pouvez utiliser Supplier<Elvis> au lieu de Elvis::getInstance.


Si vous n'avez pas besoin d'utiliser les avantages ci-dessus, il est préférable d'utiliser la première méthode.


Méthode utilisant un type énuméré

public enum Elvis {

    INSTANCE;

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


La méthode la plus souhaitable est d'utiliser un type énuméré. Cette méthode est plus sûre contre les attaques par réflexion et le code est plus propre que les deux méthodes précédentes. De plus, comme nous le verrons plus loin, les deux méthodes précédentes ont l'inconvénient de devoir ajouter du code supplémentaire lors de la sérialisation.

Cependant, il faut faire attention au fait que le singleton que vous souhaitez créer peut hériter d'une interface, mais pas d'une classe.


Points à prendre en compte lors de la sérialisation d'une classe singleton

Pour sérialiser une classe singleton créée à l'aide de la première ou de la deuxième méthode ci-dessus, vous devez non seulement implémenter Serializable, mais aussi déclarer tous les champs d'instance comme étant transitoires et redéfinir la méthode readResolve().


private Object readResolve throws ObjectStreamException {
    return INSTANCE;


Sources

제이온
제이온
제이온
제이온
[Effective Java] Item 5. Utilisez l'injection de dépendances au lieu de spécifier les ressources Si une classe dépend de ressources externes, il est préférable d'éviter d'utiliser les singletons et les classes utilitaires statiques. L'injection de dépendances peut améliorer la flexibilité, la réutilisabilité et la testabilité de la classe, et l'utili

28 avril 2024

[Efficace Java] Item 1. Envisager des méthodes d'usine statiques à la place des constructeurs Les méthodes d'usine statiques sont un moyen flexible et efficace de créer des instances à la place des constructeurs. Elles peuvent avoir un nom, renvoyer des instances répondant à des conditions spécifiques et améliorer les performances grâce à la mise

27 avril 2024

[Effective Java] Item 4 : Utilisez un constructeur privé pour empêcher l'instanciation Pour les classes utilitaires qui ne contiennent que des méthodes et des champs statiques, il est préférable de définir l'accès du constructeur sur privé pour empêcher l'instanciation. Cela permet d'éviter que les utilisateurs ne confondent le constructeur

28 avril 2024

Moquer le client Prisma pour les tests unitaires dans NestJS Lors des tests unitaires d'une application, il est important de supprimer les dépendances externes. Vous pouvez facilement effectuer des tests unitaires en utilisant la méthode de moquerie de Jest pour Prisma ORM. En installant le package jest-mock-extend
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2 avril 2024

Modélisation de données conceptuelle La modélisation de données conceptuelle est le processus de séparation des entités et de représentation de leurs relations sous forme de diagramme ERD. Une entité est une unité d'information indépendante et un attribut est une donnée possédée par une enti
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

8 avril 2024

[Next.js] Injection d'environnement d'exécution Découvrez comment configurer des variables d'environnement dans Next.js après la compilation. Nous vous présentons comment installer cross-env et modifier les scripts, ce qui est facile à suivre même pour les utilisateurs de Windows. Cela peut être utilis
Sunrabbit
Sunrabbit
Sunrabbit
Sunrabbit

20 mars 2024

[Concurrency] Opération atomique : Clôture de mémoire et ordre de mémoire Ce billet de blog explique comment prendre en compte l'ordre de la mémoire dans les opérations atomiques et l'importance des options d'ordre. Il fournit une description des diverses options d'ordre, telles que Relaxed, Acquire, Release, AcqRel et SecCst,
곽경직
곽경직
곽경직
곽경직
곽경직

12 avril 2024

[Histoire d'un développeur SI] 03. Préparation de l'entretien d'embauche dans une entreprise SI L'entretien d'embauche pour les développeurs SI met davantage l'accent sur la capacité de codage que sur les compétences techniques élevées. Ainsi, la compréhension de la structure Spring + mybatis apprise dans les écoles de formation subventionnées par l
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

16 avril 2024

Comment Rust empêche les bogues de concurrence Rust est un langage puissant qui résout les défis de la programmation concurrente. Son système de types et son modèle de propriété garantissent la sécurité du transfert et du partage de données entre les threads. Les modèles de mutabilité interne, tels qu
곽경직
곽경직
곽경직
곽경직
곽경직

28 mars 2024