2 votes

Quelle est la meilleure implémentation de singleton ?

Je regardais ces deux implémentations du modèle Singleton :

 Class Customer {

int x;
static int count = 0;

private Customer()
{
    x = 1;
}

public static Customer GetCustomer()
{
    if(count==0)
    {
        count++;
        return new Customer();
    }
    else
    {
        return null;
    }
}
}

Implémentation 1 dans laquelle le constructeur n'est pas appelé si la classe est déjà instanciée une fois. OU

 Class Customer{

int x;
static int count = 0;
public Customer()
{
    if(count == 0)
    {
        x = 1;
        count++;
    }
    else
    {
        return;
    }
}

Implémentation 2 dans laquelle le constructeur est appelé indépendamment du fait que la classe a déjà été instanciée une fois ou non. J'ai regardé un cours vidéo en ligne qui dit que l'implémentation 2 n'est pas préférable car elle alloue de la mémoire pour le constructeur bien que l'objet ne soit pas instancié pour la deuxième fois. Je sais que Java dispose d'un système de collecte automatique des déchets, mais je voulais juste savoir si ce que j'ai vu dans la vidéo était pertinent.

6voto

paxdiablo Points 341644

Il y en a qui diraient que pas de L'implémentation d'un singleton est la bonne, mais je ne suis pas tout à fait dans ce camp.

Les gens ont souvent tendance à les utiliser à mauvais escient (comme un objet divin, par exemple), mais ils ont toujours leur place (dans mon opinion, qui n'a pas grand-chose à voir avec cette réponse).

Pour les besoins de cette réponse, je vais supposer que vous avez pris la bonne décision en ayant besoin d'un singleton, mais je vous conseille vivement de vous renseigner sur ses problèmes potentiels - il pourrait bien y avoir un meilleur moyen d'arriver à vos fins.


Cela dit, je ne suis pas sûr que vos échantillons de code soient corrects de toute façon. Un singleton est censé renvoyer une et une seule instance, en créer une si nécessaire, et vous donner celle précédemment créée sinon.

Je ne vois pas comment votre premier exemple de code honore ce contrat. Il vous en donnera un nouveau la première fois qu'il sera appelé, puis il vous donnera rien après cela.

Et votre deuxième exemple de code ne semble pas empêcher les objets multiples du tout.

Donc je pensais très Réfléchissez bien pour savoir si vous voulez continuer à regarder cette vidéo, si c'est la qualité de l'enseignement qu'ils dispensent.


Dans tous les cas, je préfère celui qui ne se construit qu'une fois, puisque vous n'êtes censé avoir qu'un seul objet de cette classe. En d'autres termes, une classe statique getMe() appel qui est correctement synchronisés afin d'éviter les conditions de course permettant la création de plus d'un fichier. Me et qui crée un nouvel objet la première fois, en retournant cet objet. même lors des appels suivants.

En pseudo-code, ce serait quelque chose comme :

class Me {
    private Me() {};

    private static Me *loner = NULL;

    public static synchronised Me *getMe() {
        if loner == NULL
            loner = new Me();
        return loner;
    }
}

0voto

dcernahoschi Points 7214

Écrire un singleton correct n'est pas si facile. Vous devez prendre soin des conditions de course et vous défendre contre les attaques par réflexion. Par exemple, un constructeur privé peut être invoqué par réflexion pour créer une instance supplémentaire d'un objet. L'implémentation de singleton la plus simple et la plus sûre en Java se fait avec un enum :

enum Singleton {
    INSTANCE;
}

C'est parce que les constantes enum sont spécifiées par JLS pour être des singletons (section 8.9 de JLS) :

Un type enum n'a pas d'instances autres que celles définies par ses constantes enum.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X