Doublons possibles:
Différence entre classe statique et motif singleton?
Quelle est la différence entre un modèle Singleton et une classe statique en Java?
HI Je ne comprends pas clairement Quelle est la différence entre une classe singleton et une classe statique? Quelqu'un peut-il élaborer cela avec un exemple?
Classe Singleton : La classe Singleton est une classe dont une seule instance peut exister par chargeur de classe.
Classe statique/auxiliaire (classe avec uniquement des champs/méthodes statiques) : aucune instance de cette classe n'existe. Seuls les champs et les méthodes sont directement accessibles en tant que constantes ou méthodes d'assistance.
Ce qui suit est référencé à partir de ce blog " Les classes statiques en Java " le décrit bien. Le blog a également des exemples pour l'expliquer:
Singleton exemple:
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;
}
}
Classe statique exemple:
/**
* 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);
}
}
Alors, quelle est la différence entre les deux exemples et pourquoi je pense que la deuxième solution est meilleure pour une classe que vous ne voulez pas ou n'avez pas besoin d'instancier. Premièrement, le modèle Singleton est très utile si vous souhaitez créer une instance d'une classe. Pour ma classe d'aide, nous ne voulons pas vraiment instancier aucune copie de la classe. La raison pour laquelle vous ne devriez pas utiliser une classe Singleton est que pour cette classe d'assistance, nous n'utilisons aucune variable. La classe singleton serait utile si elle contenait un ensemble de variables dont nous voulions un seul ensemble et les méthodes utilisaient ces variables mais dans notre classe d'assistance, nous n'utilisons aucune variable en dehors de celles passées (que nous rendons finales) . Pour cette raison, je ne crois pas que nous voulons une instance singleton parce que nous ne voulons pas de variables et nous ne voulons pas que quelqu'un instancie cette classe. Donc, si vous ne voulez pas que quelqu'un instancie la classe, ce qui est normalement si vous avez une sorte de classe helper/utils, j'utilise ce que j'appelle la classe statique, une classe avec un constructeur privé et ne se compose que de méthodes statiques sans aucune toutes les variables.
La même réponse est également référencée dans ma réponse ici
Vieux que/ans sur SO: Différence entre classe statique et motif singleton?
Une classe statique est une classe qui n'a que des méthodes statiques, pour lesquelles un meilleur mot serait des "fonctions". Le style de conception incarné dans une classe statique est purement procédural.
Singleton, d'autre part, est un modèle spécifique à OO design. C'est une instance d'un objet (avec toutes les possibilités inhérentes à cela, comme le polymorphisme), avec une procédure de création qui garantit qu'il n'y a qu'une seule instance de ce rôle particulier sur toute sa durée de vie.
La différence n'est pas la bonne façon de demander.Parce que singleton n'est pas un mot-clé par rapport à statique. vous devriez demander comme "Quand choisir lequel?". quels sont les avantages de la classe singleton par rapport à la classe statique, ces questions se posent au stade de la conception.
Singleton: Utilisation: classes qui servent de configuration globale, ex: version d'essai du logiciel avec une connexion de base de données, instances de classes JDK Runtime par jvm.
Quand y aller: 1. En développant votre code, vous pensez à la compatibilité ascendante, comme demain lorsque vous aurez besoin de convertir cette classe singleton en classe normale ou d'autoriser le sous-classement. 2. Vous pouvez fournir une fonction de chargement paresseux, lorsque cette classe singleton est lourde.
statique: Utilisation: classes qui font essentiellement des conversions, fonctions utilitaires. veuillez vérifier les cours de mathématiques.
Quand y aller: 1. classes d'assistance, utilisées par toutes les classes de votre développement api.
inconvénient: 1. les classes sont chargées avec impatience.
attendre des points des autres.
C'est la différence entre un modèle et la façon dont le modèle est mis en œuvre.
Le modèle Singleton n'est pas lié spécifiquement au langage Java. Il peut y avoir différentes façons de transformer une classe en singleton, selon la langue que vous utilisez. De nombreuses langues OO utilisent l'équivalent de variables statiques pour créer un singleton, mais d'autres peuvent utiliser des techniques différentes.
De plus, certaines façons de mettre en œuvre un singleton sont meilleures que d'autres. Une bonne façon de mettre en œuvre un Singleton est d'encapsuler correctement l'accès à ce Singleton via une méthode d'usine:
public class Example {
private static final Example SINGLETON = new Example();
public static Example getInstance() { return SINGLETON; }
private Example() { /* Constructor */ }
}
En utilisant cette technique, vous pouvez faire toutes sortes de choses sophistiquées: charger le singleton paresseusement, le remplacer par une sous-classe, gérer l'initialisation des singletons via la configuration, etc.
A Singleton n'est pas un type de classe mais un modèle de conception. Avec Singleton vous (essayez de) garantir, qu'une seule instance d'une certaine classe est jamais construite à l'intérieur d'une seule machine virtuelle Java. Les implémentations modernes du modèle singleton utilisent Les implémentations plus anciennes utilisent un constructeur privé et stockent la référence à l'instance unique dans un champ statique.
Une classe statique est toujours une classe membre qui, contrairement à une classe interne, n'a pas accès aux variables d'instance de la classe environnante.
exemple de classe statique
public class A {
public static class B {
}
public int notAccessibleForB;
public static int accessibleForB;
}
motif singleton (style ancien simple)
public final class Singleton {
public final static Singleton INSTANCE = new Singleton();
private Singleton(){}
}
motif singleton (style moderne simple)
public enum Singleton {
INSTANCE;
}