7
votes

Méthode de setter dans le constructeur

Vous avez une question que je rencontre xxx

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?


4 commentaires

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 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.


6 Réponses :


1
votes

Vous devrez utiliser la pratique du code ci-dessus lorsque vous avez affaire à la validation de envoyé (que vous envoyez) de valeur.
Par exemple, si vous ne voulez pas permettre de définir un numéro négatif comme un StudentNumber 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 .

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, xxx

sur setStudentresult , 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 Student . Au lieu de cela, vous avez besoin d'ajouter un paramètre supplémentaire dans le constructeur à setStudentresult valeur. xxx


2 commentaires

Je pense que cela causera des problèmes lorsque L'étudiant 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ù.



5
votes

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 xxx


0 commentaires

1
votes

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. xxx


0 commentaires

0
votes

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.

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


1 commentaires

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.



3
votes

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.

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.


0 commentaires

0
votes

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:

  1. Les sous-classes peuvent les remplacer, ce qui mettrait probablement l'objet dans un état qui n'a pas été pris en compte.

  2. Une méthode de setter peut avoir une fonctionnalité que vous pourriez habituellement ne pas vouloir dans un constructeur.

    La raison pour laquelle cela se fait est Twofolds:

    1. 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.

    2. 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.


0 commentaires