vérifier qu'une classe est immuable

Le
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égée";

Merci d'avance !
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Emmanuel Bourg
Le #16561841
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;
}
}
acebanenco
Le #16569551
On 16 août, 20:43, 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;
     }

}



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?
Emmanuel Bourg
Le #16570291
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.
acebanenco
Le #16570701
On 18 août, 11:00, Emmanuel Bourg
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 ...
Emmanuel Bourg
Le #16573921
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.
Publicité
Poster une réponse
Anonyme