Vous avez une question que je rencontre quel est le but d'avoir la méthode de réglage dans le constructeur? et avec le SetStudentresult (0), devons-nous avoir une autre variable d'instance? p> p>
6 Réponses :
Vous devrez utiliser la pratique du code ci-dessus lorsque vous avez affaire à la validation de En outre, les méthodes de réglage sont utiles lorsque vous avez un objet créé dans une autre classe et plus tard, vous souhaitez changer. Son état, disons, vous voulez mettre à jour le nom de l'étudiant, comme étant donné exemple ci-dessous, p> sur envoyé code> (que vous envoyez) de valeur.
Par exemple, si vous ne voulez pas permettre de définir un numéro négatif comme un StudentNumber code> du constructeur, vous devez écrire une logique pour vérifier le numéro du constructeur ou de l'intérieur selon que La classe est immuable ou mutable. Si la classe est mutable, écrivez la logique à l'intérieur de la méthode et si la classe est immuable, écrivez la logique à l'intérieur du constructeur (dans la méthode de l'écriture de classe immuable n'est pas autorisée car la méthode Setter peut modifier l'état de l'objet).
Si vous n'appliquez pas une telle logique, toute valeur négative peut être définie sur StudentNumber code>.
setStudentresult code>, vous n'avez pas besoin de ne pas l'avoir encore Une autre variable d'instance telle qu'elle est déjà déclarée dans la catégorie Code> Student Code>. Au lieu de cela, vous avez besoin d'ajouter un paramètre supplémentaire dans le constructeur à
setStudentresult code> valeur. P>
Je pense que cela causera des problèmes lorsque L'étudiant CODE> est sous-classée par une autre classe, puisque le constructeur de sous-classe appelle toujours un constructeur de super classe.
Il suffit de dire que quelque chose n'est pas une bonne pratique n'est pas utile du tout. Je suis en désaccord avec votre conclusion, mais sans aucune explication, il est difficile de dire exactement où.
Appeler des méthodes onéreuses est un anti-motif, il peut causer des problèmes si l'élève est remplacé. Un bon modèle serait de rendre l'étudiant immuable
Faites-vous une logique commerciale dans vos méthodes de setter. Si oui, je suppose que c'est la raison pour laquelle vous appelez Setter du constructeur. Si vous ne faites que la variable d'instance à l'intérieur de votre setter, puis définissez la variable d'instance directement est la chose normale à faire.
Ce n'est pas une bonne idée d'appeler une méthode d'un constructeur. Les constructeurs sont utilisés pour définir la valeur initiale des champs. P>
Si vous souhaitez appeler des méthodes à partir de constructeurs et que vous n'en voulez pas, vous n'aurez pas besoin de le remplacer. Le déclarer la classe comme finale p>
Si la classe est mutable, je pense qu'il est raisonnable d'appeler les setters du constructeur - de cette façon, s'il y a une validation (par exemple, le nombre ne peut pas être négatif), vous n'avez que cette logique au même endroit. Je conviens que c'est une mauvaise idée d'appeler des méthodes non finales à partir de constructeurs, mais les Setters eux-mêmes pourraient facilement être définitifs.
La raison prétendue habituelle des configurissures dans un constructeur est de sorte que vous utilisez la même validation. Cependant, l'auto-encapsulation est un anti-motif. P>
Un bien meilleur pour faire exactement ce que vous avez écrit, c'est avoir une méthode statique qui construit l'objet et appelle les méthodes définies. Beaucoup mieux que cela serait de rendre le tout immuable. P>
Comme mentionné précédemment à l'aide des méthodes de réglage dans un constructeur n'est pas une bonne idée pour deux raisons: p>
Les sous-classes peuvent les remplacer, ce qui mettrait probablement l'objet dans un état qui n'a pas été pris en compte. P> Li>
Une méthode de setter peut avoir une fonctionnalité que vous pourriez habituellement ne pas vouloir dans un constructeur. p> li> ol>
La raison pour laquelle cela se fait est Twofolds: P>
Le plus souvent, l'IDE (tel que Eclipse) le fait automatiquement si vous générez un setter / getters après avoir écrit le constructeur. p> li>
Il y a des moments où la méthode du setter effectue des validations ou un formatage que vous souhaitez faire lors de l'initialisation avec un constructeur. Dans ce cas, je suggérerais d'extraire la validation / mise en forme sur une fonction différente et d'appeler cette fonction du constructeur et du setter. P> li> ol>
Pourquoi auriez-vous besoin d'une autre variable d'instance? On dirait que vous avez trois setters et trois variables d'instance ... bien que le fait qu'un nombre i> est stocké dans une chaîne est un peu inquiet.
@Jon Skeet - Un numéro d'étudiant n'est probablement pas un numéro. Comme un numéro de téléphone n'est pas.
@Donroby: Le numéro de téléphone n'est pas ... mais un numéro d'étudiant devrait probablement être, dans mon expérience. Ou il devrait s'appeler un identifiant d'étudiant.
Eh bien, oui - ID d'étudiant serait mieux.