Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

vérifier qu'une classe est immuable

5 réponses
Avatar
ToOmS
Bonjour,

Peut-on tester qu'une classe soit immuable ou non, SVP ?
genre : assert Collections.isImmutable(productsList) : "la liste des
produits n'est pas prot=E9g=E9e";

Merci d'avance !

5 réponses

Avatar
Emmanuel Bourg
ToOmS a écrit :
Bonjour,

Peut-on tester qu'une classe soit immuable ou non, SVP ?
genre : assert Collections.isImmutable(productsList) : "la liste des
produits n'est pas protégée";

Merci d'avance !



Dans le cas d'une collection tu peux essayer d'y ajouter des éléments et
de voir si une UnsupportedOperationException est lancée. Par exemple :

public boolean isModifiable(Collection c) {
try {
c.addAll(Collections.EMPTY_LIST);
return true;
} catch (UnsupportedOperationException e) {
return false;
}
}
Avatar
acebanenco
On 16 août, 20:43, Emmanuel Bourg wrote:
ToOmS a écrit :

> Bonjour,

> Peut-on tester qu'une classe soit immuable ou non, SVP ?
> genre : assert Collections.isImmutable(productsList) : "la liste des
> produits n'est pas protégée";

> Merci d'avance !

Dans le cas d'une collection tu peux essayer d'y ajouter des éléments et
de voir si une UnsupportedOperationException est lancée. Par exemple :

public boolean isModifiable(Collection c) {
     try {
         c.addAll(Collections.EMPTY_LIST);
         return true;
     } catch (UnsupportedOperationException e) {
         return false;
     }

}



Vérifiez également Arrays.asList cas (ils ne pouvaient pas grandir,
mais ne sont pas immuables!).

try {
if(c instanceof List && false == c.isEmpty()) {
List l = (List) c;
l.set(0, l.get(0));
} else {
c.addAll(Collections.EMPTY_LIST);
}
return true;
} catch(UnsupportedOperationException e) {
return false;
}

D'ailleurs, en ajoutant une liste vide n'est pas une proove que les
collections est immuable: il pourrait ne pas lancer une exception dans
tous les cas depuis la 2ème liste est vide.
Vous pouvez essayer de cloner que la collecte et d'effectuer toutes
les actions que vous voulez sur le clone. Vous pouvez vérifier
"remove", "set" et "add" les méthodes contre de collecte cloné.
Pouvez-vous fournir plus de détails sur la collecte du cycle de vie
après cette vérification pour immutabilité, s’il vous plaît? Qu'e st-ce
que vous allez faire avec mutable collections et ce avec immuable?
Avatar
Emmanuel Bourg
acebanenco a écrit :

D'ailleurs, en ajoutant une liste vide n'est pas une proove que les
collections est immuable: il pourrait ne pas lancer une exception dans
tous les cas depuis la 2ème liste est vide.



Les collections non modifiables créées par
java.util.Collections.unmodifiableCollection(), unmodifiableList(),
unmodifiableMap(), unmodifiableSet() et celles provenant de Commons
Collections lancent toutes une UnsupportedOperationException en cas de
modification, je pense que le test est suffisant.
Avatar
acebanenco
On 18 août, 11:00, Emmanuel Bourg wrote:
Les collections non modifiables créées par
java.util.Collections.unmodifiableCollection(), unmodifiableList(),
unmodifiableMap(), unmodifiableSet() et celles provenant de Commons
Collections lancent toutes une UnsupportedOperationException en cas de
modification, je pense que le test est suffisant.



Et qu'en est-il de Collections.singleton et Collections.singletonList?
Ces deux méthodes retourne immuables collections, mais aucun des faux
collecte lance addAll exception de méthode lors de l'ajout d'une
collection vide ...
Avatar
Emmanuel Bourg
acebanenco a écrit :

Et qu'en est-il de Collections.singleton et Collections.singletonList?
Ces deux méthodes retourne immuables collections, mais aucun des faux
collecte lance addAll exception de méthode lors de l'ajout d'une
collection vide ...



Effectivement ça ne marche pas dans ce cas.