[Lire Java efficace] Chapitre 2 Item 1 "Considérez les méthodes de fabrique statiques plutôt que les constructeurs"

introduction

Si vous voulez approfondir votre compréhension de Java, lisez ceci, donc je lirai Effective Java tout en l'interprétant à ma manière. Je lis la deuxième édition que je lisais. https://www.amazon.co.jp/EFFECTIVE-JAVA-Java-Joshua-Bloch/dp/4621066056/ref=pd_sbs_14_3/355-5139262-7829161?_encoding=UTF8&pd_rd_i=4621066056&pd_rd_r=ac861412-beae-43a8-872a-8b853aa69980&pd_rd_w=oIuWA&pd_rd_wg=nhmjU&pf_rd_p=7642417c-6494-4d06-a2b0-fcb0e0b3c563&pf_rd_r=HAEC02ASTQVJ4SPSM92Q&psc=1&refRID=HAEC02ASTQVJ4SPSM92Q

Considérez les méthodes de fabrique statiques au lieu des constructeurs

Je me demande s'il y a différentes choses qui me rendent heureux si je remplace le traitement qui a été implémenté à l'aide du constructeur par une méthode de fabrique statique.

Exemple de code

Exemple 1



public static Boolean valueOf(boolean b){
    return b ? Boolean.TRUE : Boolean.FALSE;
}

Exemple 2



//Cadre du fournisseur de services
public interface Service{
    //Méthodes spécifiques au service ici
}

//Interface du fournisseur de services
public interface Provider{
    Service newService();
}

//Classe non immuable pour l'enregistrement et l'accès au service
public class Service{
    private Service(){} //Supprimer l'instanciation (élément 4)

    //Associer le nom du service au service
    private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>();
    public static final String DEFAULT_PROVIDER_NAME = "<def>";

    //API d'inscription des fournisseurs
    public static void registerDefaultProvider(Provider p){
        registerProvider(DEFAULT_PROVIDER_NAME,p);
    }
    public static void registerProvider(String name,Provider p){
        providers.put(name,p);
    }

    //API d'accès au service
    public static Service newInstance(){
        return newInstance(DEFAULT_PROVIDER_NAME);
    }
    public static Service newInstance(String name){
        Provider p = providers.get(name);
        if (p == null)
            throw new IllegalArgumentException(
                    "Nn provider registered with name:" + name
            );
        return p.newService();
    }
    
}

Glossaire

constructeur

-Un constructeur est un processus qui est exécuté lorsqu'une instance d'une classe est créée.

SampleClass instanceA = new SampleClass();

↑ La description de SampleClass () après new est l'appel du constructeur

-Comment écrire le constructeur: faites-en le même que le nom de la classe


public class SampleClass {
  //constructeur
  public SampleClass(){
    System.out.println("C'est un constructeur");
  }
}

↑ Lorsqu'il est nouveau avec ceci, "C'est un constructeur" est sorti en standard

-Contrairement aux méthodes, les constructeurs ne retournent pas de valeurs (l'écriture de return entraînera une erreur)

static -Modificateurs pour créer des méthodes et des variables indépendantes de l'instance

méthode d'usine statique

-Une méthode de fabrique statique est simplement une méthode statique qui renvoie un objet. -Dans l'exemple 1, la valeur de données de base booléenne (b) est convertie en objet booléen.

Méthode d'usine de modèle de conception

・ Bien que le nom soit similaire, il est différent de la méthode d'usine statique. ・ L'explication est omise ici

interface

-Une interface est une description d'une "variable" ou d'un "type de méthode" sans écrire le traitement spécifique de la méthode dans la classe. -La condition est que "toutes les méthodes sont des méthodes abstraites" et "fondamentalement, elles n'ont aucun champ". -Étant donné que le contenu de traitement n'est pas spécifiquement écrit, il est pratique de mettre en œuvre le contenu de traitement lorsque vous souhaitez l'utiliser, ce qui est pratique lorsque le traitement peut changer à l'avenir (les détails peuvent être reportés).

4 avantages et 2 inconvénients de la méthode d'usine statique

Avantage 1 A un nom différent du constructeur

-Le constructeur sera exécuté sans permission lorsqu'il est nouveau, mais s'il s'agit d'une méthode de fabrique statique, il recevra un joli nom, donc il sera plus lisible.

Par exemple, supposons qu'il existe un processus qui renvoie un BigInteger qui est un premier probable.

-Comment écrire dans le constructeur

BigInteger(int, int, Random)

-Comment écrire avec la méthode de fabrique statique

BigInteger.probablePrime

… Lequel est le plus facile à comprendre?

Avantage 2 Contrairement au constructeur, il n'est pas nécessaire de créer un nouvel objet à chaque fois qu'une méthode est appelée.

・ C'est naturel, mais comme c'est statique, il n'est instancié en rien. Doit être nouveau pour appeler le constructeur ・ Ce n'est pas si bon de créer inutilement beaucoup de nouveaux objets.

Avantage 3 Contrairement au constructeur, il peut renvoyer un objet de n'importe quel sous-type du type de retour de la méthode.

-Le constructeur ne renvoie pas de valeur de retour, mais la méthode de fabrique statique n'est qu'une méthode, elle peut donc être retournée, elle est donc flexible. ・ Un framework de fournisseur de services comme l'exemple 2 (masqué le contenu et utilisé comme API) sera également créé.

Avantage 4 Réduit les tracas liés à l'instanciation des types paramétrés

・ Rédaction simplifiée Par exemple, dans le cas d'un constructeur, ce que je devais écrire comme ça

Map<String, List<String>> m =
  new HashMap<String, List<String>>();

Vous pouvez écrire ceci comme une méthode de fabrique statique

Map<String, List<String>> m = HashMap.newInstance();

C’est simple, non?

Bien sûr, dans les coulisses, la méthode de fabrique statique est implémentée comme ceci

public static <K, V> HashMap<K, V> newInstance() {
  return new HashMap<K. V>;
}

Inconvénient 1 Impossible de créer une sous-classe d'une classe qui n'a pas de constructeur public ou protégé

Inconvénient 2 Ils ne se distinguent pas facilement des autres méthodes statiques

-Contrairement au constructeur, Javadoc ne le reconnaît pas bien

Nom générique de la méthode de fabrique statique

Nom rôle
valueOf Renvoie une instance avec la même valeur que le paramètre. Il s'agit essentiellement d'une méthode de conversion de type.
of Alternative à valueOf. Un plus concis.
getInstance Renvoie l'instance spécifiée par le paramètre, mais n'a pas la même valeur. Pour les singletons, getInstance ne prend aucun argument et renvoie sa seule instance.
newInstance Similaire à getInstance, sauf que les instances individuelles renvoyées par newInstance sont toutes des instances distinctes.
getType Similaire à getInstance, mais utilisé lorsque la méthode de fabrique est dans une classe différente de la classe cible. Type indique le type d'objet renvoyé par la méthode de fabrique.
newType Similaire à newInstance, mais utilisé lorsque la méthode de fabrique est dans une classe différente de la classe cible. Type indique le type d'objet renvoyé par la méthode de fabrique.

Continuer

[Lire Java efficace] Chapitre 2 Item 2 "Considérez un constructeur face à un grand nombre de paramètres de constructeur" https://qiita.com/Natsukii/items/eb8fec0d8cae567f6647

Recommended Posts

[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 12 "Considérer l'implémentation de Comparable"
[Lire Java efficace] Chapitre 2 Item 7 "Eviter les finaliseurs"
[Lire Java efficace] Chapitre 2 Item 5 "Eviter la création d'objets inutiles"
[Lire Java efficace] Chapitre 3 Item 10 "Always Override toString"
[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 2 Item 6 "Supprimer les références d'objets obsolètes"
Méthodes efficaces du chapitre 8 de Java 3rd Edition
[Lire Java efficace] Chapitre 2 Item 4 "Forcer l'impossibilité d'immobilisation avec un constructeur privé"
[Lire Java effectif] Chapitre 3 Rubrique 9 "Lors de la substitution d'égaux, toujours remplacer hashCode"
[Lire Java efficace] Chapitre 3 Point 8 "En cas de remplacement égal, suivez le contrat général"
Efficace Java Chapitre 2
Élément 90: considérez les proxies de sérialisation au lieu des instances sérialisées
Effective Java Chapitre 6 34-35
Nom de la méthode de la méthode de fabrique statique apprise à partir de Java 8
Effective Java Chapitre 4 15-22
Java efficace Chapitre 3
[Lire Java efficace] Chapitre 2 Item 3 "Forcer les caractéristiques de singleton avec un constructeur privé ou un type enum"
Efficace Java 3rd Edition Chapitre 3 Méthodes communes à tous les objets
[Java] Classes, constructeurs, membres statiques
Avantages de la méthode statique Java