Ne déclarez pas les interfaces pour les objets immuables
[EDIT] Lorsque les objets en question représentent des objets de transfert de données (DTO) ou des données anciennes (POD)
Est-ce une directive raisonnable?
Jusqu'à présent, j'ai souvent créé des interfaces pour des classes scellées qui sont immuables (les données ne peuvent pas être modifiées). J'ai moi-même essayé de ne pas utiliser l'interface où je me soucie de l'immuabilité.
Malheureusement, l'interface commence à pénétrer le code (et ce n'est pas seulement mon code qui m'inquiète). Vous finissez par passer une interface, puis vous voulez la passer à un code qui veut vraiment supposer que la chose qui lui est passée est immuable.
En raison de ce problème, j'envisage de ne jamais déclarer d'interfaces pour des objets immuables.
Cela pourrait avoir des ramifications en ce qui concerne les tests unitaires, mais à part cela, cela semble-t-il une directive raisonnable?
Ou existe-t-il un autre modèle que je devrais utiliser pour éviter le problème "d'interface d'étalement" que je vois?
(J'utilise ces objets immuables pour plusieurs raisons: principalement pour la sécurité des threads car j'écris beaucoup de code multithread; mais aussi parce que cela signifie que je peux éviter de faire des copies défensives des objets passés aux méthodes. Le code devient beaucoup plus simple dans de nombreux cas où vous savez que quelque chose est immuable - ce que vous ne faites pas si vous avez reçu une interface. En fait, souvent vous ne pouvez même pas faire une copie défensive d'un objet référencé via une interface s'il ne fournit pas de opération de clonage ou tout moyen de le sérialiser ...)
[MODIFIER]
Pour fournir beaucoup plus de contexte à mes raisons de vouloir rendre les objets immuables, voir ce billet de blog d'Eric Lippert:
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
Je dois également souligner que je travaille avec certains concepts de niveau inférieur ici, tels que les éléments qui sont manipulés / transmis dans des files d'attente de travaux multithreads. Ce sont essentiellement des DTO.
Joshua Bloch recommande également l'utilisation d'objets immuables dans son livre Effective Java .
Suivre
Merci pour la rétroaction, tout. J'ai décidé d'aller de l'avant et d'utiliser cette directive pour les DTO et leurs semblables. Ça marche bien jusqu'à présent, mais ça ne fait qu'une semaine ... Pourtant, ça a l'air bien.
Il y a d'autres questions à ce sujet que je veux poser; notamment quelque chose que j'appelle "Immuabilité profonde ou superficielle" (nomenclature que j'ai volée du clonage Deep and Shallow) - mais c'est une question pour une autre fois.
List<Number>
qui peut contenir Integer
, Float
, Long
, BigDecimal
, etc ... qui sont eux - mêmes immuables.