Pourquoi peut-on également utiliser un constructeur vide?
Je lisais quelques Java récemment et suis tombé sur quelque chose (un idiome?) nouveau pour moi: dans le programme des classes avec plusieurs constructeurs, serait également toujours inclure un constructeur vide. Par exemple:
public class Genotype {
private boolean bits[];
private int rating;
private int length;
private Random random;
public Genotype() { // <= THIS is the bandit, this one right here
random = new Random();
}
/* creates a Random genetoype */
public Genotype(int length, Random r) {
random = r;
this.length = length;
bits = new boolean[length];
for(int i=0;i<length;i++) {
bits[i] =random.nextBoolean();
}
}
/* copy constructor */
public Genotype(Genotype g,Random r) {
random = r;
bits = new boolean[g.length];
rating = g.rating;
length = g.length;
for(int i=0;i<length;i++) {
bits[i] = g.bits[i];
}
}
}
Le premier constructeur ne semble pas être un "vrai" constructeur, il me semble que dans tous les cas, l'un des autres constructeurs seront utilisés. Alors, pourquoi est ce que le constructeur du tout défini?
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr que le code que vous étiez en train de lire est de haute qualité (je l'ai passé en revue une partie de la bioinformatique code dans le passé et il n'est malheureusement pas souvent écrits par des développeurs professionnels). Par exemple, que le troisième constructeur n'est pas un constructeur de copie et généralement il y a des problèmes dans ce code, je ne voudrais pas "lire trop".
Le premier constructeur est un constructeur par défaut. Il initialise seulement le strict minimum et permet aux utilisateurs de régler le reste avec des getters et setters. D'autres constructeurs sont souvent "la commodité des constructeurs" qui aident à créer des objets avec moins d'appels. Cependant, cela peut souvent conduire à des incohérences entre les constructeurs. En fait, il y a de la recherche récente qui montre qu'un constructeur par défaut avec les appels suivants à poseurs est préférable.
Il y a aussi certains cas où un constructeur par défaut est critique. Par exemple, certains cadres comme l'autoclave (utilisé pour créer des objets directement à partir de XML) utiliser la valeur par défaut des constructeurs. JavaBeans en général utiliser des constructeurs par défaut, etc.
Aussi, certaines classes hériter d'autres classes. vous pouvez voir un constructeur par défaut lors de l'initialisation de l'objet parent est "assez bon".
Dans ce cas précis, si le constructeur n'a pas été défini, il faudrait connaître tous les détails à l'avance. Ce n'est pas toujours préférable.
Et enfin, quelques IDEs de générer automatiquement un constructeur par défaut, il est possible que celui qui a écrit la classe a peur de l'éliminer.
CoffeeCup mug = new cupBuilder().setShape(fat).setPractical(true).setHandle(true).build()
est-ce que vous êtes en train de parler?Est l'objet Serializable?
Oui, je suis d'accord le "vide" constructeur ne doit pas toujours exister (dans mon expérience, les débutants font souvent cette erreur), bien qu'il existe des cas lors de la vierge constructeur devrait suffire. Toutefois, si la vierge constructeur viole l'invariant que tous les membres sont correctement instancié après la construction, vide constructeur ne doit pas être utilisé. Si le constructeur est compliqué, il est préférable de diviser la construction en plusieurs protected/private méthodes. Ensuite, utilisez un statique méthode ou d'une autre Usine classe d'appeler le protégé de méthodes pour la construction, en tant que de besoin.
Ce que j'ai écrit ci-dessus est le scénario idéal. Cependant, des frameworks comme spring supprimer le constructeur de la logique du code, et dans certains fichiers de configuration xml. Vous pouvez avoir des getter et setter fonctions, mais sans doute peut-être évité à partir de l'interface, comme décrit ici.
Constructeur par défaut n'est PAS obligatoire.
Si aucun des constructeurs définis dans la classe par défaut (vide) constructeur sera créé automatiquement. Si vous avez fourni aucune paramétrées constructeur(s), puis de constructeur par défaut ne sera pas créé automatiquement et il est préférable de créer par vous-même. Des cadres d'utiliser l'injection de dépendance et de la dynamique de la création de proxy lors de l'exécution nécessitent habituellement le constructeur par défaut. Elle dépend donc, des cas d'utilisation de la classe que vous écrivez.
Le constructeur par défaut n'est pas une bonne pratique pour le point de vue fonctionnel.
Le constructeur par défaut est utilisé si l'objet ont une visibilité à l'échelle mondiale dans une méthode: par exemple, vous souhaitez connecter l'état réel d'un objet dans un try/catch
vous pouvez code
ou préférez-vous
?
Anotherway créer un objet VIDE ont pas beaucoup de logique, mais démarrent des instances d'un objet NUL est harmuful à mon avis.
Vous pouvez lire ce post
Qui n'est PAS un constructeur de copie. Fondamentalement, vous voulez vider les constructeurs lorsque l'on travaille avec un certain cadre. Doit-il toujours être un constructeur vide, bien sûr, public ou privé, mais au moins, ça permet de garder le contrôle de la façon dont la classe est en train d'être (ou pas) instancié.
J'ai l'habitude d'écrire un constructeur qui initialise entièrement l'objet; si il en existe d'autres, ils appellent tous ce(...) si les valeurs par défaut.
Un objet doit être de 100% initialisé et prêt à être utilisé lorsqu'il est créé.
Certains cadres, par exemple en veille prolongée, à la demande de non-arg constructeur. La façon dont ils se heurtent à des pratiques exemplaires qui me rend mal à l'aise parfois.
Avoir un défaut et vide (vide) constructeur évite d'avoir tout le final champs. Cela conduit à beaucoup de mutabilité où il n'est souvent pas nécessaire.
Le générateur de modèle vous permet de mélanger ces deux styles et de donner une plus grande souplesse d'initialisation, tout en ayant encore l'immuabilité en cacher beaucoup d'arg constructeur derrière l'usine.
Pour certaines classes POJO ou simple de la classe, le constructeur par défaut est utile lorsque vous parfois envie de faire des tests unitaires sur la classe de les utiliser. Vous n'avez pas besoin de se moquer d'eux, vous pouvez de nouveau un objet avec un constructeur par défaut et le test de la valeur à définir et à obtenir d'eux ou de les passer comme un argument.
Vous souhaitez créer un nouveau constructeur pour les classes qui a étendu cette
classe et depuis elle a été étendue à la classe... l'enfant a maintenant super qui fait référence à la classe ci-dessus c'est que c'est parent. Dans le cas où l'enfant n'a pas précisé super(les choses)... les trucs à l'intérieur pour référence les autres constructeurs à utiliser, il va maintenant tenter de référence du constructeur vide.
Je ne suis pas sûr de ce que l'erreur sera je suis de codage mon premier parent relation de l'objet maintenant et était à la recherche de choses ici ha acclamations.
Je suppose que je devrais ajouter, au moment de vous faire un constructeur qui n'est pas le vide, vous perdez la valeur par défaut est vide alors maintenant, super() qui est par défaut dans la classe étendue de ne pas avoir quelque chose à point de. Bien sûr, si vous avez créé l'étendue des classes pour prendre soin de super en spécifiant sur ce qui se débarrasse de la valeur par défaut de super (), alors vous avez passer à côté de cette, mais si quelqu'un veut utiliser votre classe et de l'étendre de lui et ne le savais pas, il n'y a pas un ensemble vide quand vous pourriez avoir
juste créé un.
Ceci est mon premier post mais je voulais prendre une fissure de la façon dont je le comprends.