[Lire Java efficace] Chapitre 2 Item 3 "Forcer les caractéristiques de singleton avec un constructeur privé ou un type enum"

Appliquer les caractéristiques de singleton avec un constructeur privé ou un type enum

Avant Java1.5, il y avait deux façons d'implémenter singleton (exemple 1, exemple 2), mais la troisième méthode (exemple 4) qui est devenue possible en 1.5 est la meilleure.

Glossaire

Singleton

Un type de modèle de conception. Parfois appelé "motif Singleton". En bref, une classe créée exactement une fois. Il est utilisé lorsque vous voulez réaliser l'état selon lequel "il n'y a toujours qu'une seule instance d'une certaine classe".

Comment faire un singleton -Déclarer le constructeur comme privé. (Pour empêcher le constructeur d'être appelé du côté qui utilise cette classe)

-Déclarez la méthode getInstance () pour obtenir une instance de manière statique. Cela permet à l'utilisateur d'obtenir une instance en appelant Singleton # getInstance ().

Échantillon d'une tonne


/**
 *Informations de configuration à l'échelle de l'application
 */
public class Config {
    /**
     *Déclarez le constructeur privé afin qu'il ne puisse pas être instancié en externe
     */
    private Config() {
        //En fait, les informations de réglage sont obtenues à partir de la base de données de fichiers, etc.
        //Écrivez le processus à lire ici
    }

    /**
     *Renvoie uniquement l'instance
     * @return La seule instance de cette classe
     */
    public static Config getInstance() {
        return ConfigInstanceHolder.INSTANCE;
    }

    /**
     *Renvoie la valeur de réglage correspondant à la clé spécifiée
     * @touche de réglage de la clé de param
     * @valeur de réglage de retour
     */
    public String getValue(String key) {
        //En fait, les informations de paramétrage lues par le constructeur
        //Écrivez le processus pour revenir ici
        return ....;
    }

    /**
     *Classe interne qui contient la seule instance de la classe Config
     */
    public static class ConfigInstanceHolder {
        /**Seule instance*/
        private static final Config INSTANCE = new Config();
    }
}

type d'énumération

Enum (type d'énumération) est un type qui peut combiner plusieurs constantes en une seule. La constante définie par Enum est appelée un énumérateur.

public class Main {
 
    public static void main(String[] args) {
        Fruit fruit_type = Fruit.Orange;
        
        System.out.println(fruit_type);
    }
    
    protected enum Fruit {
        Orange,
        Apple,
        Melon
    };
    
}

Résultat d'exécution


Orange

Elvis Presley

Grand rock'n'roller J'aime "Un peu moins de conversation" https://www.youtube.com/watch?v=Zx1_6F-nCaw

Elvis has left the Building.

C'est une expression liée au célèbre épisode du chanteur populaire Elvis Presley du passé. Même après le concert de Presley, le public a été invité à quitter la salle en annonçant «Elvis a déjà quitté ce bâtiment» au public qui hésite à revenir en prévision d'Angkor. ..

Actuellement, il est utilisé pour la fin de tout événement.

Exemple de code

Comment faire une seule tonne avant 1.5 Partie 1

Le constructeur est preavte, qui fournit des membres statiques publics afin que les utilisateurs de la classe puissent accéder à la seule instance de la classe.

Le constructeur privé n'est appelé qu'une seule fois pour initialiser le champ final statique public Elvis.INSTANCE. Cela garantit qu'Elvis est le seul au monde.

Exemple 1



//Singleton par champ final public
public class Elvis{
    public static final Elvis INSTANCE = new Elvis();
    private Elvis() { ... }

    public void leaveTheBuliding() { ... }

}

Comment faire une seule tonne avant 1.5 Partie 2

La deuxième méthode consiste à rendre le premier membre public statique. Renvoie une référence d'objet avec Elvis.getInstance (). La bonne chose à ce sujet est que la déclaration indique clairement que la classe est singleton.

Exemple 2



//Singleton avec méthode de fabrique statique
public class Elvis{
    private static final Elvis INSTANCE = new Elvis();
    private Elvis() { ... }
    public static Elvis getInstance() { return INSTANCE; }

    public void leaveTheBuilding() { ... }
}

Cependant, il est possible qu'un faux existe dans Elvis créé par les méthodes des exemples 1 et 2, et il est nécessaire d'ajouter la méthode suivante pour l'empêcher.

Exemple 3



//Méthode ReadResolve pour préserver les caractéristiques des singleton
private Object readResolve() throws ObjectStreamException{
    /*
     *Retournez le vrai Elvis et transformez le faux Elvis en éboueur
     *Débarrassez-vous-en.
     * 
     */
    return INSTANCE;
}

Le dernier et le meilleur moyen

La troisième méthode possible depuis Java 1.5. Créez simplement un type enum avec un seul élément. C'est une description simple, et il y a des murs en fer qui n'autorisent pas les faux, donc si vous voulez faire une seule tonne, utilisez cette méthode.

Exemple 4



//enum singleton-Méthode préférée
public enum Elvis {
    INSTANCE;

    public void leaveTheBuilding() { ... }
}

Continuer

[Lire Java efficace] Chapitre 2 Item 4 "Forcer l'impossibilité de l'instanciation avec un constructeur privé" https://qiita.com/Natsukii/items/661b645482d814b73914

Recommended Posts

[Lire Java efficace] Chapitre 2 Item 3 "Forcer les caractéristiques de singleton avec un constructeur privé ou un type enum"
[Lire Java efficace] Chapitre 2 Item 4 "Forcer l'impossibilité d'immobilisation avec un constructeur privé"
Forcer non immuable avec le constructeur privé Effective Java
[Lire Java efficace] Chapitre 2 Item 7 "Eviter les finaliseurs"
[Lire le Java efficace] Chapitre 2 Item 2 "Considérez un constructeur face à un grand nombre de paramètres de constructeur"
[Lire Java efficace] Chapitre 3 Item 10 "Always Override toString"
[Lire Java efficace] Chapitre 3 Point 12 "Considérer l'implémentation de Comparable"
[Lire Java efficace] Chapitre 2 Item 6 "Supprimer les références d'objets obsolètes"
[Lire Java efficace] Chapitre 2 Item 5 "Eviter la création d'objets inutiles"
[Lire Java efficace] Chapitre 2 Item 1 "Considérez les méthodes de fabrique statiques plutôt que les constructeurs"
[Lire Java efficace] Chapitre 3 Point 8 "En cas de remplacement égal, suivez le contrat général"
Efficace Java Chapitre 2
Effective Java Chapitre 6 34-35
Effective Java Chapitre 4 15-22
Java efficace Chapitre 3
Java getClass () est incompatible avec les génériques (ou les variables de type)
Implémentez rapidement singleton avec enum en Java