Forcer non immuable avec le constructeur privé Effective Java

La propre interprétation efficace de Java. J'ai essayé d'interpréter le point 4 de la 3e édition en écrivant mon propre code.

Conclusion

Pour les classes qui n'ont que des membres statiques, fournissez un constructeur privé qui déclenche une exception d'exécution.

La description

Par exemple, une classe utilitaire qui ne collecte que les processus courants (ci-après dénommée classe Util) ne possède que des méthodes statiques et des variables statiques, et n'est pas fondée sur l'instanciation.

En général, la classe publique Util a un constructeur par défaut public à moins qu'un constructeur ne soit défini, il y a donc un risque qu'il soit instancié inutilement dans une classe externe.

En définissant explicitement un constructeur privé, il est possible d'empêcher les appels de constructeur en dehors de la classe Util. De plus, en insérant un traitement de sortie d'exception dans le constructeur, il est possible de faire d'un appel de constructeur dans la classe Util une erreur.

Code sans définition de constructeur (mauvais exemple)

** Classe Util **

public class SampleUtil {

    public static final String HOGE = "hoge";

    public static String fugaMethod() {
        return "fuga";
    }
}

** Classe d'appelant **

public class SampleService {

    public String sampleMethod() {
        //Inutilement instancié
        SampleUtil sampleUtil = new SampleUtil();
        return sampleUtil.fugaMethod();
    }
}

Je crée une instance dans la classe appelante. Puisque fugaMethod () est une méthode statique, il est inutile de l'instancier.

Code avec définition de constructeur privé (bon exemple)

** Classe Util **

public class SampleUtil {

    //Définir un constructeur qui est privé et génère une exception d'exécution
    private SampleUtil() {
        throw new IllegalStateException("Util instance construction is not allowed.");
    }

    public static final String HOGE = "hoge";

    public static String fugaMethod() {
        return "fuga";
    }

}

** Classe d'appelant **

public class SampleService {

    public String sampleMethod() {
        return SampleUtil.fugaMethod();
    }
}

Puisque le constructeur est privé, il ne peut pas être instancié dans une autre classe en premier lieu.

De plus, même si le constructeur est appelé dans la classe Util, une exception sera générée et aucune instance ne sera créée. Si vous avez du code qui appelle un constructeur, c'est une erreur de programmation, alors assurez-vous de lever une exception d'exécution.

Recommended Posts

Forcer non immuable avec le constructeur privé Effective Java
[Lire Java efficace] Chapitre 2 Item 4 "Forcer l'impossibilité d'immobilisation avec un constructeur privé"
[Lire Java efficace] Chapitre 2 Item 3 "Forcer les caractéristiques de singleton avec un constructeur privé ou un type enum"
[Java] Tester des méthodes privées avec JUnit
java (constructeur)
Constructeur Java
Efficace Java Chapitre 2
Effective Java Chapitre 6 34-35
Effective Java Chapitre 4 15-22
Comprendre le constructeur java
Java efficace Chapitre 3
[Java] Comment omettre l'injection de constructeur de ressort avec Lombok
[Java] Se référer et définir des variables privées avec réflexion
Installez java avec Homebrew
Changer de siège avec Java
Installez Java avec Ansible
3ème résumé efficace de Java
Téléchargement confortable avec JAVA
Mémo privé payant Java
Changer java avec direnv
Etudier Java 8 (voir constructeur)
Téléchargement Java avec Ansible
Traitement des appels du constructeur JAVA
Raclons avec Java! !!
Construire Java avec Wercker
À propos de l'encapsulation Java Private Public
Modèle de générateur (Java effectif)
Conversion Endian avec JAVA
[Lire le Java efficace] Chapitre 2 Item 2 "Considérez un constructeur face à un grand nombre de paramètres de constructeur"