Liste non modifiable en java

j'essaie de mettre un List inmodifiable.

Dans mon code, j'ai une méthode qui renvoie une liste.

cette liste ne devrait pas être modifiée, mais je ne veux pas attraper l'exception retournée par l'unmodifiableList.

private List<T> listeReferenceSelectAll = null;
List<T> oListeRet = new ArrayList<T>();
oListeRet = listeReferenceSelectAll;
return new ArrayList<T>(oListeRet);

C'est un code existant et je dois le transformer en retour un inmodifiable liste, mais si un "" la méthode a été appelée, aucune exception ne doit être rattrapé.

D'abord j'ai créé une classe qui implémente List à remplacer "ajouter" pour enregistrer l'exception et non pas à l'attraper.

<!-Mais je ne sais pas comment l'instancier correctement...

10
demandé sur ROMANIA_engineer 2013-05-03 13:57:32

7 réponses

Si vous devez absolument le faire, essayez de respecter le contrat spécifié par java.util.Liste dans la liste que vous créez.

votre code ressemblerait à quelque chose comme

public class UnmodifiableArrayList<E>  extends ArrayList<E> {

    public UnmodifiableArrayList(Collection<? extends E> c) {
        super(c);
    }

    public boolean add(int index) {
        return false;//Returning false as the element cannot be added 
    }

    public boolean addAll(Collection<? extends E> c) {
        return false;//Returning false as the element cannot be added 
    }

    public E remove(int index) {
        return null;//Returning null as the element cannot be removed
    }
}

ajouter toutes les méthodes dont vous avez besoin sur les mêmes lignes. assurez-vous que tous les constructeurs et les méthodes qui pourraient être utilisées pour modifier votre code sont redéfinies, afin de s'assurer que la liste ne soit pas modifiable.

utilisation de L'API Collections est le nettoyant et meilleure façon de le faire, alors utilisez cette façon seulement si vous utilisez des Collections.UnmodifiableList ne répond pas à vos besoins.

et gardez à l'esprit que ce sera un cauchemar pendant le débogage afin de se connecter autant que possible.

2
répondu gap_j 2013-05-03 10:54:05

Vous avez besoin d' java.util.Collections:

return Collections.unmodifiableList(oListeRet);

si vous devez écrire le vôtre, demandez à cette classe d'implémenter le List interface et lancer des exceptions pour les méthodes qui modifient le contenu.

58
répondu duffymo 2013-05-03 09:59:48

Collections.unmodifiableList

renvoie une vue non modifiable de la liste spécifiée. Cette méthode permet de modules permettant aux utilisateurs d'accéder "en lecture seule" aux listes internes. Les opérations de requête sur la liste retournée "lisez" à l' liste, et tente de modifier la liste retournée, que ce soit directement ou via son itérateur, entraîne une exception D'opération non supportée. Le retour de l' liste sera sérialisable si la liste spécifiée est serializable. De même, la liste retournée implémentera RandomAccess si la liste spécifiée.

16
répondu Achintya Jha 2016-01-06 09:47:51

Java-9 fournit une nouvelle méthode pour créer inmodifiable/immuableList:

jshell> List<Integer> list = List.of(1,2,3);
list ==> [1, 2, 3]

jshell> list.add(10);
|  java.lang.UnsupportedOperationException thrown: 
|        at ImmutableCollections.uoe (ImmutableCollections.java:70)
|        at ImmutableCollections$AbstractImmutableList.add (ImmutableCollections.java:76)
|        at (#6:1)

Liste. crée une liste immuable contenant un nombre arbitraire d'éléments.

4
répondu Anton Balaniuc 2017-03-11 21:21:52

bien que la réponse acceptée traite de la demande d'omettre / avaler le UnsupportedOperationException, il devrait y avoir une explication de pourquoi c'est une mauvaise pratique.

1) l'intention générale d'avaler une exception est en contradiction avec le principe du "fail-fast". Au lieu de déceler et d'attraper les défauts plus tôt, ils sont simplement autorisés à passer "sous le tapis" et à se transformer en bombes à retardement.

2) Ne pas lancer UnsupportedOperationException est une violation directe de l'

Throws:
    UnsupportedOperationException - if the add method is not supported by this list.

donc la bonne réponse à ce qui est écrit dans le titre de la question: "Unmodifiable List in java" devrait toujours être:

return Collections.unmodifiableList(oListeRet);
3
répondu Alexey Dmitriev 2015-03-28 09:54:35

1) ces lignes n'ont aucun sens

List<T> oListeRet = new ArrayList<T>();
oListeRet = listeReferenceSelectAll;
return Collections.unmodifiableList(oListeRet);

vous n'avez pas besoin de prendre exception il peut jeter, ils sont tous UnsupportedOperationException-RuntimeExceptions

0
répondu Evgeniy Dorofeev 2013-05-03 10:03:27

les commentaires sur la liste non modifiable sont corrects. Créer un accesseur de méthode qui appelle les Collections.unmodifiableList. Cependant, vous pouvez utiliser un tableau comme so, et utiliser une liste en interne.

 public MyObject[] getObjects() {
    return (MyObject[]) mList.toArray();
 }
0
répondu Joel Teply 2016-06-05 17:26:50