J'ai 3 classes:
où p> et p> in car shellerror code> il y a champs dont certains sont facultatifs et que d'autres sont nécessaires. Je construis mon objet de la manière suivante: p> shellerror code> s'étend erreur code>, i plus loin: p > shellError = new ShellError.Builder(exception, "Some description").setFile(filePattern).setHost(host)
.setPath(path).setSource(file.isSource()).
setJobName(p.getJobName()).build();
3 Réponses :
Basé sur les fonctions que vous avez référencées, ce n'est clairement pas la norme Java.Lang.Error classe. Typiquement, les constructeurs sont utilisés pour permettre à un objet immuable d'être facilement construit ou de fournir des fonctionnalités similaires à des "paramètres nommés" dans les cas où il existe de nombreux paramètres de configuration / de construction. P>
Dans ce cas particulier, il serait plus raisonnable si la classe d'erreur était immuable après la construction, et si ces fonctions setter supplémentaires étaient sur le constructeur au lieu de la classe d'erreur. Je ne sais pas combien de contrôle vous avez sur l'une de ces classes, mais si vous pouvez les modifier, je vous suggère d'abord de faire en sorte que le constructeur prend en charge les mêmes setters, vous permettant ainsi de faire toute la configuration au constructeur. Ensuite, s'il est possible de le faire, vous pouvez essayer de supprimer ces méthodes setter et permettant au lieu de configurer ceux-ci du constructeur. Si vous n'avez pas de contrôle sur tout cela, vous pouvez potentiellement prolonger la classe de constructeur avec un autre qui soutient ces méthodes supplémentaires. P>
Qu'est-ce que tu as fait de sens. Il semble que la conception des classes de constructeur et d'erreur ne font pas nécessairement beaucoup de sens, vous forçant à écrire du code qui se sent inélégant ou incohérentes. P>
Le modèle de constructeur , popularisé par Josh Bloch, a Plusieurs avantages , mais cela ne fonctionne pas si élégamment sur le parent / sous-classes, comme expliqué dans Cette discussion de nos collègues Le monde C # . La meilleure solution que j'ai vue jusqu'à présent est Celui-ci (ou un Légère variante de celui-ci). P>
Juste pour compléter ce post, «légère variante» signifie: dans le dernier et dernier exemple: (1) Le constructeur doit être abstrait (2) Obj et ThiObj devrait être protégé (3) construit -> Obj
Comme il était déjà dit, le modèle de constructeur n'est pas quelque chose qui pourrait être organiquement adapté à la politique d'initialisation de l'objet Java existante. Il existe plusieurs approches pour atteindre le résultat requis. Bien entendu, il est toujours préférable d'éviter toute pratique ambiguë, ce n'est pas toujours possible. Mon hack est basé sur l'API de réflexion Java avec des génériques: l'initialisation: p>