10
votes

Héritage Java, utilisant un modèle de constructeur

J'ai 3 classes:

  1. erreur li>
  2. shellerror li>
  3. Weberror Li> ol>

    où p> xxx pré>

    et p> xxx pré>

    in 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> xxx pré>

    car 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();
    


0 commentaires

3 Réponses :


5
votes

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.

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.

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.


0 commentaires

14
votes

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


1 commentaires

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



0
votes

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

l'initialisation: xxx


0 commentaires