Les fonctions qui renvoient des "propriété exclusive" de nouvellement créé mutable objets doivent souvent être les plus spécifiques au type de pratique; ceux qui retournent des objets immuables, surtout si elles peuvent être partagées, doit souvent revenir moins des types spécifiques.
La raison de cette distinction est que dans le premier cas, l'objet sera toujours en mesure de produire un nouvel objet du type indiqué, et depuis le destinataire de l'objet et il n'y a pas de raconter ce que les actions que le destinataire peut souhaiter effectuer, il y aurait généralement aucun moyen pour le code de retour de l'objet pour savoir si une alternative implémentations d'interface pourrait fonction des besoins du bénéficiaire.
Dans ce dernier cas, le fait que l'objet est immuable signifie que la fonction peut être en mesure de déterminer un autre type qui peut faire tout ce qu'un plus compliquée pourrait le faire compte tenu de sa teneur exacte. Par exemple, un Immutable2dMatrix
interface peut être implémentée par un ImmutableArrayBacked2dMatrix
de la classe et un ImmutableDiagonal2dMatrix
classe. Une fonction qui est censé renvoyer un carré Immutable2dMatrix
pourraient décider d'y retourner un ImmutableDiagonalMatrix
exemple si tous les éléments hors de la diagonale principale arriver à zéro, ou un ImmutableArrayBackedMatrix
si pas. Le premier type serait prendre beaucoup moins d'espace de stockage, mais le destinataire ne se soucient pas de la différence entre eux.
De retour Immutable2dMatrix
plutôt que d'un béton ImmutableArrayBackedMatrix
code permet de choisir le type de retour que le tableau contient; cela signifie également que si le code qui est censé renvoyer le tableau se trouve être la tenue d'une mise en œuvre adaptée de l' Immutable2dMatrix
il suffit de retourner que, plutôt que d'avoir à construire une nouvelle instance. Ces deux facteurs peuvent être des "victoires" lorsque vous travaillez avec des objets immuables.
Lorsque vous travaillez avec des objets mutables, cependant, aucun facteur entre en jeu. Le fait qu'une mutable tableau pourrait ne pas avoir d'éléments hors de la diagonale principale lorsqu'elle est générée ne signifie pas qu'il n'aura jamais de tels éléments. Par conséquent, si un ImmutableDiagonalMatrix
est effectivement un sous-type d'un Immutable2dMatrix
, MutableDiagonalMatrix
n'est pas un sous-type d'un Mutable2dMatrix
, puisque cette dernière pourrait accepter les magasins hors de la diagonale principale, alors que les anciens ne le peuvent pas. De plus, bien que des objets immuables souvent peut et doit être partagé, mutable objets ne peuvent généralement pas. Une fonction qui est demandé pour une nouvelle mutable collection initialisé avec certains contenus aurez besoin pour créer une nouvelle collection si oui ou non son magasin de sauvegarde correspond au type demandé.