Bonjour,
ligne 5 : est ce correct comme ça ou vaut-il mieux this.surnom = surnom; ?
Ca dépend. En utilisant le setter, tu effectues le contrôle de validation dès la construction sans dupliquer le code.
Dans ce petit exemple c’est évidemment un avantage, et si tu suis la logique du DDD comme mode de développement, c’est un très très bon réflexe.
Selon les cas, ça peut toutefois poser problème: si les calculs sont lourds dans le setter, si la validation ne doit pas être faite à la construction mais à un autre moment, ou si tu dois renvoyer les erreurs en une seule fois de manière groupée à l’utilisateur. Dans ces cas tu ne peux pas valider les données directement dans les setters, tu as besoin d’une méthode spécifique pour ça.
ligne 16 : est ce OK de gérer des erreurs comme ça?
Mème réponse que ci-dessus: si c’est OK pour toi de valider un à un les attributs dès leur modification, oui et c’est un très bon réflexe; sinon, non. Pour les besoins de ton cours ça sera sûrement plutôt oui.
A cela près qu’il ne faut pas utiliser RuntimeException mais un type plus spécifique d’exception représentant plus précisément l’erreur: IllegalArgumentException (paramètre incorrect), IndexOutOfBoundsException (paramètre hors bornes admissibles), NoSuchElementException (élément non trouvé), IllegalStateException (modification de l’attribut au mauvais moment), etc. ou un type d’exception perso si tu en as un (ce n’est pas obligatoire, c’est seulement utile d’en créer un si tu peux apporter des informations plus précises sur l’erreur que par les types standards). En principe on n’utilise pas RuntimeException en tant que tel mais uniquement ses sous-classes.
Dans ton cas ici le type correct à utiliser serait donc sans doute IllegalArgumentException.