9
votes

Y a-t-il un moyen de faire une matrice ordinaire immuable dans Java?

Googled pour cela, trouvé beaucoup de code. Mais n'importe lequel d'entre eux m'a donné ce que je veux. Je veux faire un tableau ordinaire immuable. J'ai essayé ceci: xxx

mais cela ne fonctionne pas, je peux attribuer un tableau 5 dans [0] ... Y a-t-il un moyen de rendre ce tableau immuable? >


11 commentaires

Stackoverflow.com/Questtions/3700971/Immutable-array-in-java < / a>


Contrairement à C, vous ne pouvez pas. Cependant, vous pouvez utiliser une enveloppe.


Vous faire une matry variable finale ne prévient que d'attribuer un nouveau tableau. Autant que je sache, il n'ya aucun moyen de faire valoriser la finale.


Pourquoi n'utilisez-vous pas l'arraylist ou créez votre propre wrapper?


Parce que mon professeur a dit que cette matrice ne peut pas être une collection: /


Eh bien, dans ce cas, vous écrivez votre propre wrapper, mais laissez-moi vous dire que ce serait toujours une collection :). Soyez une matrice ou une arraylist à la fin de la journée que vous utilisez pour stocker des données.


@yak Votre professeur a des malentendus fondamentaux sur les tableaux, ou vous n'avez pas tout dit ... mais dans tous les cas, il n'y a pas de "résolution de devoirs"


@zerocoll peut être une collection d'éléments, mais pas une collection définie par le JDK


D'accord, mais YAK dit que son professeur dit que cette matrice ne peut pas être collection, voulait juste clarifier que même une matrice est une collection. Je comprends que ce n'est pas pareil que Java.Util.Collection.


Donc, je suppose que je dois écrire cette enveloppe .. Merci! :)


Un petit point de pédantisme: une liste immuable n'est pas la même chose qu'une liste non modifiable. Une liste immuable ne changera pas . Une liste non modifiable est celle qui vous ne pouvez pas changer à travers les méthodes d'accès régulières de cette liste . Mais collections.unmodifiablelist est simplement chargé de la liste d'origine plutôt que de la création d'une copie, de sorte que vous gardez la référence d'origine à Temp autour, vous pouvez appeler TEMP. Ajouter et regarder le changement de liste "immuable" au cours de sa vie. (D'autre part, toarray crée une copie, donc même si la liste était vraiment immuable, la nouvelle matrice est toujours modifiable.)


3 Réponses :


3
votes

Il est impossible avec des matrices primitives.

Vous devrez utiliser les collections.unmodifiablelist () comme vous l'avez déjà fait dans votre code.


0 commentaires

5
votes

Si vous voulez utiliser comme tableau , vous ne pouvez pas.

Vous devez créer une enveloppe pour cela, de sorte que vous lancez une exception, disons, .Set () , mais aucune quantité d'emballage autour de vous ne vous permettra de lancer une exception sur: xxx

bien sûr, l'immuabilité des éléments est une autre affaire!

Remarque: L'exception standard à lancer pour des opérations non prises en charge est judicieuse nommée non pris en chargeOrexception ; Comme il est décoché, vous n'avez pas besoin de le déclarer dans la clause de votre méthode .


0 commentaires

1
votes

Vous pouvez également utiliser Immutablelist de Guava , une mise en œuvre de la liste de liste aléatoire et performante, immuable et immuable qui n'autorise pas les éléments NULL. Contrairement à Collections.Unmodifiablelist (Java.Util.list) , qui est une vue d'une collection séparée qui peut toujours changer, une instance d'immutableliste contient ses propres données privées et ne changera jamais.


1 commentaires

Toutefois, OP dit que le "résultat final" ne doit pas être une collection ... sinon, ouais, de GUAVA's immuable * rock.