8
votes

Peut-on arrêter la course d'un constructeur?

Je dois créer un objet de type. La classe de l'objet n'a qu'un constructeur (celui que j'ai écrit).

Mon programme Recevez des demandes de créer des instances d'objets avec un identifiant de paramètre. Je veux arrêter le constructeur si le paramètre ID contient un caractère qui n'est pas un chiffre.

Je ne peux pas vérifier le paramètre avant, puisque je ne suis pas celui qui appelle le constructeur.


0 commentaires

3 Réponses :


6
votes

Le seul moyen de "arrêter" un constructeur est de lancer une exception. Gardant à l'esprit bien sûr que l'appelant est censé "savoir" à propos de cette exception et être capable de gérer le cas où le constructeur échoue.

Jeter une exception du constructeur ne cessure pas de la création de l'objet, cela rend simplement l'affectation de sa référence à une échec variable et la référence inévalable (et donc éligible pour la collecte des ordures) à moins que Vous faites l'erreur de passer ceci à une méthode externe du constructeur lui-même. (Que vous ne devriez pas faire de toute façon.)


0 commentaires

20
votes

Faire le constructeur privé et expose une méthode d'usine statique, qui validera et renvoyera une nouvelle instance de l'objet si le paramètre est valide.


1 commentaires

+1 C'est en effet la solution idéale si vous pouvez aussi changer le code de l'appelant.



4
votes

Comment résoudre cela dépend de ce que vous voulez faire lorsqu'un caractère illégal est donné, ce qui dépend à son tour de quel objet nous parlons et comment la bibliothèque consommation utilise-t-elle.

La chose la plus raisonnable à faire serait de lancer un illegalargumentException , et c'est ce que je vous suggérerais de faire.

Cependant, cela pourrait avoir un sens à juste renvoyer NULL , même si je recommanderais fortement contre celui-ci (vous ne pouvez pas le faire directement dans le constructeur, mais vous pouvez créer une usine méthode qui fait cela).


2 commentaires

C'est que: disons que j'ai deux cours. Classe VIPContact qui dérive du contact de la classe. Le constructeur de la classe VIPContact appelle le constructeur de contact. Il (Contact Contact) vérifie si le paramètre est valide.


Je ne peux pas "renvoyer null" car le type de retour du constructeur est annulé.