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
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 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();
}
}
-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
-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.
・ Bien que le nom soit similaire, il est différent de la méthode d'usine statique. ・ L'explication est omise ici
-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).
-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?
・ 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.
-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éé.
・ 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>;
}
-Contrairement au constructeur, Javadoc ne le reconnaît pas bien
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. |
[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