8 votes

Pourquoi pouvons-nous changer la liste non modifiable si nous avons la liste originale ?

En regardant le code de Collections j'ai appris que lorsqu'on utilise la méthode unmodifiableList(List list) ou unmodifiableCollection(Collection c) il ne s'agit pas de créer un nouvel objet mais de retourner la référence du même objet et de surcharger les méthodes qui peuvent modifier l'objet. List [ add , addall , remove , retainAll ... ]
J'ai donc effectué ce test :

List modifiableList = new ArrayList();
modifiableList.add ( 1 );   
List unmodifiableList = Collections.unmodifiableList( modifiableList );
// unmodifiableList.add(3);  // it will throw the exception 
modifiableList.add ( 2 );       
System.out.println( unmodifiableList );

Le résultat est [ 1,2 ] .
La question est de savoir pourquoi il s'agit du même objet. Pourquoi ne pas créer un nouvel objet ?

0voto

Kumar Abhishek Points 1248

Je trouve qu'un moyen de faire ça est

List unmodifiableList = Collections.unmodifiableList( new ArrayList(modifiableList));

List<String> strings = new ArrayList<String>();
        // unmodifiable.add("New string");
        strings.add("Aha 1");
        strings.add("Aha 2");
        List<String> unmodifiable = Collections.unmodifiableList(strings);
        List<String> immutableList = Collections.unmodifiableList(new ArrayList<>(strings));
        // Need some way to fix it so that Strings does not Modify
        strings.add("Aha 3");
        strings.add("Aha 4");

        strings.remove(0);

        for (String str : unmodifiable) {
            System.out.println("Reference Modified :::" + str);
        }

        for (String str : immutableList) {
            System.out.println("Reference Modified :::" + str);
        }

-2voto

Dead Programmer Points 5428
  1. vous devriez créer un nouvel objet d'une liste, seulement lorsque l'objet original va être modifié et que vous avez besoin d'une sauvegarde, lorsque quelqu'un le corrompt, vous pouvez le remplacer par un nouvel objet.

  2. Pour créer un objet umodifiable, je vais envelopper l'objet original et empêcher l'ajout et le retrait en lançant une exception. Mais vous savez, je peux changer chaque objet présent dans la liste, par exemple si vous avez un objet personne dans une liste umodifiable, je peux toujours changer le nom de l'objet personne dans la liste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X