Est-il possible de faire un objet "Lecture seule" à une méthode
Si une référence d'objet est passé à une méthode, est-il possible de faire l'objet de "Lecture Seule" pour la méthode?
source d'informationauteur Don Li
Vous devez vous connecter pour publier un commentaire.
Pas à proprement parler. C'est une référence qui peut muter un objet ne peut pas être transformé en une référence qui ne peut pas muter un objet. Aussi, il n'y a pas de façon d'exprimer qu'un type est immuable ou mutables, autres que l'utilisation des conventions.
La seule fonction que d'assurer une certaine forme de l'immuabilité serait
final
champs - une fois écrit, ils ne peuvent pas être modifiés.Cela dit, il existe des moyens de classes de conception de sorte que indésirables de mutation sont empêchés. Voici quelques techniques:
La Défensive De La Copie. Transmettre une copie de l'objet, de sorte que si il est muté, il n'a pas à casser votre intérieur invariants.
Utilisation modificateurs d'accès et/ou interface pour exposer uniquement en lecture seule des méthodes. Vous pouvez utiliser l'accès modifieres (
public
/private
/protected
), éventuellement combiné avec l'interface, de sorte que seules certaines méthodes sont visibles de l'autre objet. Si les méthodes qui sont exposées sont en lecture seule, par nature, vous êtes en sécurité.Rendre votre objet immuable par défaut. Toute opération sur l'objet renvoie en fait une copie de l'objet.
Il est également à noter que l'API du SDK ont parfois des méthodes qui renvoient une immuable version d'un objet, par exemple
Collections.unmodifiableList
. Une tentative de muter une liste immuable lèvera une exception. Ce n'est pas l'application de l'immuabilité de manière statique (à la compilation avec le système de type statique), mais c'est un moyen économique et efficace de l'appliquer de manière dynamique (à l'exécution).Il y a eu beaucoup de propositions de recherche de l'extension Java pour un meilleur contrôle de l'aliasing, et l'accessibilité. Par exemple, l'ajout d'un
readonly
mot-clé. Aucun d'eux n'est pour autant que je sais prévu pour l'inclusion dans une future version de Java. Vous pouvez jeter un oeil à ces pointeurs si vous êtes intéressé:Le Vérificateur Cadre est très intéressant. Dans le Vérificateur de Cadre, regardez le Générique de l'Univers Types de checker, IGJ immutabilité checker, et Javari immutabilité checker. Le framework fonctionne à l'aide d'annotations, de sorte qu'il n'est pas intrusif.
Non, pas sans la décoration, de la composition, le clonage, etc.
Il n'y a pas de mécanisme général pour que. Vous aurez besoin d'écrire spéciales code de la réaliser, comme la rédaction d'un immuable wrapper (voir
Collections.unmodifiableList
).Vous pourriez obtenir quelque chose de similaire dans la plupart des cas par le clonage de l'
Object
comme la première déclaration de la méthode, comme cela...Donc, si vous l'avez appelé
readOnlyMethod()
et passer dans tous lesObject
un clone de laObject
seront prises. Le clone utilise le même nom que le paramètre de la méthode, donc il n'y a aucun risque de modification accidentelle de l'originalObject
.Pas. Mais vous pouvez essayer de cloner l'objet avant de le transmettre, afin que toutes les modifications apportées par la méthode n'affecte pas l'objet d'origine.
Vous pouvez définir tous les paramètres des objets comme
final
mais qui fait de l'objet en lecture seule pour tout le monde.prise de mettre en place une interface qui ne dispose que de lire seulement les méthodes (pas de setter) cela donne une copie d'un objet (route seule copie) et en retournant le lire en une seule instance de l'interface au lieu de renvoyer l'instance d'un objet lui-même
Selon l'endroit où vous souhaitez que la règle appliquée. Si vous travaillez en étroite collaboration sur un projet, utilisez
final
avec un commentaire indiquant la prochaine personne qu'ils ne visent pas à modifier cette valeur. Sinon, n'est-ce pas tout simplement écrire la méthode de pas toucher l'objet?De façon spécifique à cette méthode, la valeur ne sera jamais écrit, et elle est appliquée au moment de la compilation offrant une solution extrêmement robuste. En dehors de la champ d'application de cette méthode, l'objet reste le même, sans avoir à créer toute sorte d'emballage.