Maison  >  Article  >  Java  >  Quelle est la différence entre new et newInstance en Java ?

Quelle est la différence entre new et newInstance en Java ?

不言
不言original
2018-09-21 16:33:342116parcourir

Le contenu de cet article porte sur quelle est la différence entre new et newInstance en Java ? Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Lors de l'initialisation d'une classe et de la génération d'une instance ; quelle est la différence entre newInstance() et new ?

Il y a une différence entre utiliser newInstance et utiliser new La différence réside dans la manière de. création d'objets. Le premier utilise le mécanisme de chargement de classe, alors pourquoi existe-t-il deux façons de créer des objets. Cela doit être expliqué du point de vue des idées logicielles telles que l'évolutivité, l'extensibilité et la réutilisabilité.
Le modèle d'usine en Java utilise souvent newInstance pour créer des objets, vous pouvez donc également trouver des réponses spécifiques sur les raisons pour lesquelles vous devriez utiliser le modèle d'usine.
Par exemple :

Class c = Class.forName(“A”);
factory = (AInterface)c.newInstance();

où AInterface est l'interface de A. Si c'est écrit ainsi, vous comprendrez peut-être :

String className = “A”;
Class c = Class.forName(className);
factory = (AInterface)c.newInstance();

Plus loin , si ce qui suit Écrivez, vous comprendrez peut-être :

String className = readfromXMlConfig;//从xml 配置文件中获得字符串
Class c = Class.forName(className);
factory = (AInterface)c.newInstance();

Le code ci-dessus élimine le nom de la classe A. Avantages : Peu importe la façon dont la classe A change, le code ci-dessus reste inchangé et vous pouvez remplacez même la classe sœur de A B. C, D... etc., tant qu'ils héritent de Ainterface.
Du point de vue de la JVM, lorsque nous utilisons new, la nouvelle classe n'a pas besoin d'être chargée
Mais lors de l'utilisation de newInstance, nous devons nous assurer que :

1. a été en cours de chargement

2. Cette classe a été connectée. C'est la méthode statique forName() de la classe qui complète les deux étapes ci-dessus. Cette méthode statique appelle le chargeur de classe de démarrage (c'est-à-dire le chargeur qui charge l'API Java).

Avec la compréhension ci-dessus de la JVM, nous pouvons dire que newInstance décompose en fait la nouvelle méthode en deux étapes, c'est-à-dire qu'elle appelle d'abord la méthode de chargement de classe pour charger une certaine classe, puis l'instancie.
Les avantages de cette approche étape par étape sont évidents. Nous pouvons gagner une meilleure flexibilité en appelant la méthode de chargement statique pour le nom de la classe, ce qui nous fournit un moyen de découplage.

[Supplément :]
nouvelleInstance : Type faible. Inefficace. Seuls les constructeurs sans paramètres peuvent être appelés.
nouveau : Fortement typé. Relativement efficace. Peut appeler n'importe quel constructeur public.
newInstance() est un choix inévitable pour implémenter des méthodes techniques telles que l'IOC, la réflexion, la programmation orientée interface et l'inversion de dépendances. new ne peut implémenter que l'instanciation de classes spécifiques et ne convient pas à la programmation d'interface.
À l'intérieur, un objet est construit via le constructeur par défaut de cette classe. S'il n'y a pas de constructeur par défaut, une InstantiationException sera levée. S'il n'y a pas d'autorisation pour accéder au constructeur par défaut, une IllegalAccessException sera levée.

1. Utilisation du code :

On peut voir que new et newInstance ont le même effet. .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn