java: des avantages de la des objets immuables dans les exemples
donner moi s'il vous plaît des exemples où je pouvais voir les avantages des objets immuables. Info que j'ai trouvé dans internet sont concentrés dans les threads. Je ne sais pas à propos des threads encore. ce serait génial si les exemples, utilisation des principes simples
Le principal avantage de Java est dans l'utilisation de threads. Il ne peut pas faire sens pour vous jusqu'à ce que vous avez une compréhension de base de threads. Il fait également plus de sens quand vous avez une expérience de la programmation et les choses qui peuvent mal se passer. esp sur de grands projets complexes.
Il permet de simplifier votre compréhension des interactions dans votre code, si vous savez qu'un objet a un état qui ne peut pas être modifié à partir de l'extérieur.
Il permet de simplifier votre compréhension des interactions dans votre code, si vous savez qu'un objet a un état qui ne peut pas être modifié à partir de l'extérieur.
OriginalL'auteur Nazerke | 2011-04-13
Vous devez vous connecter pour publier un commentaire.
Immutabilité est important dans les programmes multi-thread, parce que vous savez qu'un thread ne sera pas endommager une valeur utilisée dans un autre thread. Mais il est également utile dans un programme monothread.
Voici un exemple simple:
Vous souhaiterez peut-être de savoir, Quelle est la valeur qui est passé au bar()?
Supposons que foo() est un grand complexe de la fonction. Dans cet exemple, je sais pour un fait absolu que lorsque foo terminée, je est toujours égal à 17, en raison d'un nombre Entier est immuable. Ont été qui n'est pas vrai, je l'aurais à l'étude de foo pour savoir si il peut être modifié ou pas.
Voici un exemple légèrement plus complexe. Supposons que j'ai un objet qui ressemble à un Entier, mais est mutable. Appelons ça de la MutableInteger. Ensuite, dire que j'écris ceci:
Voyez-vous le problème avec ce qui précède? neededInventory et currentInventory pointent vers le même objet. Tous les additionne et soustrait sont vraiment agir sur la même valeur, pas deux valeurs différentes, de sorte que lorsque nous arrivons à l'essai, il sera toujours égale. Le code ci-dessus n'auraient jamais fonctionner si les objets sont mutables. Si elles sont immuables, les additionne et soustrait aurait à retourner un objet de résultat plutôt que la mise à jour en place, et qui serait à l'œuvre.
Il y a des années, j'ai utilisé un compilateur Fortran où entiers ONT été mutable. Nous avons eu une fonction qui accepte plusieurs paramètres, l'un d'entre eux d'un nombre entier. Dans certains cas rares, la fonction de mise à jour de l'entier. Puis un jour, quelqu'un a écrit un appel à cette fonction en passant la constante "2" comme l'entier. La fonction a décidé de mettre à jour le paramètre, et donc de changer la "constante" de 2 à 1! Tous les autres endroits dans le programme qui a utilisé une constante 2 maintenant mystérieusement obtenu la valeur 1 au lieu de. Cela a pris beaucoup de temps à déboguer.
Donc, ce serait plus clair s'il a été déclaré que Java doit donc TOUJOURS passer par référence, et de ne pas copier. Donc, toutes les valeurs passées peuvent être modifiées, SAUF si elles sont immuables. Je pense que c'est du PHP, si, ça passe tout par la valeur à enregistrer une copie du temps et de la mémoire, tout comme Java, MAIS si l'objet est modifié, alors il est copié et la fonction/méthode, puis ne pas modifier l'objet.
Eh bien, il ya des moments où vous voulez être en mesure de modifier le passé-dans l'objet. Par exemple, créez un objet de commande avec la liste des articles commandés, puis passer à une fonction qui calcule la taxe de vente et la remplit dans l'ordre de l'objet. Ce n'est pas tellement immuable=bon / mutable=mauvais, que de savoir ce que vous êtes en train de faire dans chaque cas. Il y a quelque chose à dire pour les langues qui vous demandent de vous dire si vous êtes de passage par référence ou par valeur et donc de permettre et de vous obliger à décider de façon explicite.
OriginalL'auteur Jay
Ce n'est pas un concept qui peut être utilement expliqués avec des exemples. L'avantage des objets immuables, c'est que vous connaissez leurs données ne peuvent pas changer, de sorte que vous n'avez pas à vous soucier de cela. Vous pouvez circuler librement sans avoir à se souvenir si un méthode de vous les transmettre, de les modifier dans un moyen de votre code n'est pas préparé à gérer. Qui vous permet de travailler avec des données immuables plus facile.
Avec plusieurs threads, cet avantage est juste de plus en plus important en raison des bugs basé sur plusieurs threads de la modification des données de manières qu'il n'est pas censé être modifiés ne sont généralement pas reproductible - ils dépendent de timing et donc se produisent parfois et parfois pas, ce qui les rend très difficiles à analyser et à corriger.
OriginalL'auteur Michael Borgwardt
Que Java retourne en valeur (c'est à dire les références de l'objet sont renvoyées par les méthodes), si par exemple je retourne une Chaîne de caractères comme suit:
et de la classe String n'était pas immuable, alors le visiteur de
getString()
pourrait modifiermyString
, qui ne peut être que le comportement souhaité; d'autres parties du système peut ne pas vouloir ni s'attendre àmyString
à changer. Si l'appelant ne peut modifier l'objet quimyString
points à, pasmyString
lui-même.Vous devez vous rappeler que, dans l'exemple ci-dessus, myString est en fait une référence à un objet de type String, et non pas l'objet lui-même. Donc, pour en revenir à cela.myString renvoie, par valeur, la référence à myString.
Selon mes informations , Java, les chaînes sont immuables, donc je ne pense pas que l'appelant peut modifier l'original de l'objet privé myString. Quand il essaie de modifier une nouvelle Chaîne obj est créé .
Bhat: Oui, c'était le point de ma réponse. Si les Chaînes n'étaient pas immuables, alors que l'appelant serait en mesure de modifier l'original myString.
ok, alors , désolé interprétation erronée
OriginalL'auteur Dunnie
C'est un peu tautologique, mais le principal avantage des objets immuables, c'est qu'ils ne peut pas changer. Lorsque les objets peuvent changer, vous devez penser à ce qui pourrait se passer avec eux. Vous devez penser à comment, quand et pourquoi vous voulez changer. Vous avez à penser à ce que d'autres code dans votre application peut avoir accès à l'objet même, et ce qu'il pourrait changer, sans le savoir. Des objets immuables de réduire efficacement le nombre (et la granularité) de "pièces en mouvement", il faut jongler dans votre système et de rendre votre vie plus facile.
OriginalL'auteur ColinD
Comme vous le savez déjà, c'est un grand modèle pour le multithreading.
Cela signifie aussi beaucoup meilleure encapsulation. Vous pouvez passer ces objets et de les partager et de vous de ne jamais, jamais avoir à s'inquiéter que quelqu'un change de l'objet d'état.
Il y a quelques bons exemples en Java de base de la bibliothèque. Nombre de sous-classes sont un, mais je pense que le meilleur exemple est
String
. Vous les transmettre autour de, concaténer, obtenir des sous-chaînes, etc. et ne jamais avoir à penser à d'autres endroits. Si c'était mutable comme le C/C++char[]
, vous aurait toujours besoin de garder cela à l'esprit.Pour la même raison, il conduit également à plus lisible et maintenable code. Pas besoin de prendre soin des autres utilisateurs de l'objet.
Ces deux raisons nous amènent à un autre modèle important appelé Objet de Valeur. En bref, c'est logique, quand on soin de certains de la valeur particulière de (une date, un nombre, une chaîne, un intervalle de temps, de l'argent, ou quelque peu plus complexe des objets si vous avez besoin d'), mais la valeur elle-même n'a pas d'identité, c'est à dire qu'il a exactement le même sens quel que soit le contexte.
OriginalL'auteur Konrad Garus
Des objets immuables sont utiles lorsque les objets sont généralement partagées - et pas seulement avec les threads, mais dans un thread aussi des programmes où un objet a de nombreux clients.
Par exemple,
String
est sans doute le plus utilisé immuable objet en Java. Il est immuable pour les utilisateurs d'arrêt de la chaîne de modifier son contenu. SiString
est mutable, cela voudrait dire que chaque utilisateur devra créer un unique exemplaire de cette chaîne pour s'assurer que personne d'autre était en train de changer.Immuable des données a également des implications en matière de sécurité. Par exemple, un jeton de sécurité associé à un utilisateur doit être immuable, sinon un programme malveillant peut facilement changer l'utilisateur associé à ce jeton.
OriginalL'auteur mdma
L'idée principale ici est de faire de vos classes thread-safe en utilisant des objets immuables. Je pense que ce l'article est une bonne lecture sur ce.
Espérons que cette aide!
OriginalL'auteur CoolBeans
Un bon exemple est le
String
classe:Un bon résumé des motifs pour des objets immuables peut être trouvé ici
OriginalL'auteur Tnem