5 différence entre le constructeur et la méthode d'usine statique dans Java- Avantages et inconvénients

Mais, il existe une autre technique qui peut être utilisée pour créer des objets en Java et chaque programmeur Java expérimenté devrait le savoir. Une classe peut fournir une méthode d'usine statique publique qui peut renvoyer une instance de la classe, par ex. HashMap.newInstance (). La méthode d'usine est un moyen intelligent de créer des objets en Java et offre plusieurs avantages par rapport à l'approche traditionnelle de création d'objets en utilisant des constructeurs en Java. Il peut également améliorer la qualité du code en rendant le code plus lisible, moins couplé et améliore les performances par la mise en cache.

Constructeur vs méthode d'usine en Java

Le problème que nous avons vu dans le paragraphe précédent est juste l'un des nombreux problèmes auxquels vous êtes confronté lorsque vous décidez de fournir un constructeur public pour créer une instance de la classe, vous apprendrez plus de ces lacunes du constructeur en Java que nous discutons des différences réelles. par un. Heureusement, les méthodes Factory répondent à de nombreuses limitations des constructeurs en Java et aident à écrire du code plus propre.

Voici ma liste des principales différences entre le constructeur et la méthode d'usine statique en Java. Toutes ces différences découlent de la carence des constructeurs et expliquent comment les méthodes d'usine statiques résolvent ces problèmes. Ils expliqueront également les avantages et les inconvénients relatifs des différentes façons de créer des objets en Java.

Noms lisibles

Une des limitations sérieuses du constructeur est que vous ne pouvez pas lui donner un nom explicite, le nom doit être le même que le nom de la classe. Si votre classe renvoie deux types d'objets différents dans un but différent, vous pouvez utiliser des méthodes d'usine avec des noms plus lisibles.

Un bon exemple de ce concept est la classe java.text.NumberFormat dans JDK, qui fournit différentes méthodes d'usine pour renvoyer différents objets, par ex. getCurrencyInstance () pour renvoyer une instance de NumberFormat qui peut formater la devise, getPercentInstance () pour renvoyer un format de pourcentage et getNumberInstance () pour renvoyer une mise en forme de numéro d'usage général.

Si vous avez utilisé new NumberFormat (), il aurait été difficile de savoir quel type d'instance de NumberFormat aurait retourné.

Polymorphisme

Une autre limitation sérieuse d'un constructeur est qu'il retourne toujours le même type d'objet. Vous ne pouvez pas faire varier le type d'objet construit, il doit être le même que le nom de l'entrepreneur. Mais la méthode d'usine peut renvoyer un objet de différentes sous-classes, par ex. Dans l'exemple ci-dessus, si vous appelez getNumberInstance (), il retourne un objet de la classe DecimalFormat.

Le polymorphisme permet également aux méthodes d'usine statiques de renvoyer des instances de classes non publiques, par ex. RegularEnumSet et JumboEnumSet dans le cas de l'interface EnumSet. Lorsque vous appelez la méthode EnumSet.of (), qui est une méthode d'usine statique, il peut renvoyer une instance de l'une ou l'autre de cette classe en fonction du nombre de constantes enum dans la classe Enum que vous avez fournie.

Couplage

Les méthodes d'usine favorisent l'idée de codage à l'aide d'Interface puis de l'implémentation, ce qui résulte en un code plus flexible, mais le constructeur lie votre code à une implémentation particulière.

D'un autre coté, en utilisant le constructeur, vous serrez étroitement n'importe quel client (qui utilise cette classe) à la classe elle-même. Tout changement de classe, par ex. L'introduction d'un nouveau constructeur ou d'une nouvelle implémentation nécessitera des changements presque partout.

Type Inférence

Jusqu'à Java 7, le constructeur ne fournit pas d'inférence de type automatique, ce qui signifie que vous devez déclarer les types génériques sur les côtés gauche et droit de la déclaration de la variable, comme indiqué ci-dessous.

Cela entraîne un code illisible et encombré. Java 7 a amélioré ceci en introduisant l'opérateur de diamant, qui aide à déduire des types, mais la méthode d'usine a cette inférence de type juste de Java 1.5. Google Guava a créé plusieurs classes d'utilitaires statiques avec beaucoup de méthodes d'usine pour tirer parti de l'inférence de type améliorée fournie par les méthodes d'usine. Voici quelques exemples.

Mise en cache

Un constructeur crée toujours un nouvel objet dans le tas. Il n'est pas possible de renvoyer une instance en cache d'une classe à partir du constructeur. D'un autre côté, les méthodes Factory peuvent tirer parti de la mise en cache. En fait, il est courant de renvoyer la même instance de classes immuables à partir de la méthode usine au lieu de toujours en créer une nouvelle.

En résumé, les méthodes d'usine statiques et le constructeur ont leur utilisation et il est important pour un développeur expérimenté de comprendre leurs mérites relatifs. Dans la plupart des cas, les usines statiques sont de meilleurs choix, donc évitez la possibilité de fournir des constructeurs publics sans d'abord considérer les usines statiques pour créer des objets.