web-dev-qa-db-fra.com

Liste non modifiable dans java

J'essaie de définir un List non modifiable.

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

Cette liste ne doit pas être modifiée, mais je ne veux pas intercepter l'exception renvoyé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 pour retourner une liste non modifiable, mais si une méthode "add" a été appelée, aucune exception ne doit être interceptée.

J'ai d'abord créé une classe qui implémente List pour remplacer la méthode "add" pour consigner l'exception et non pour l'attraper.

Mais je ne sais pas comment l'instancier correctement ...

12
user2346325

Si vous devez absolument le faire, essayez de suivre le contrat spécifié par Java.util.List dans la liste que vous créez.

Votre code ressemblerait à quelque chose

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
    }
}

Ajoutez d'autres méthodes dont vous avez besoin sur les mêmes lignes. Juste assurez-vous que tous les constructeurs et méthodes qui pourraient être utilisés pour modifier votre code sont remplacés, afin de vous assurer que la liste n'est pas modifiable.

L'utilisation de l'API Collections est le moyen le plus propre et le plus efficace de le faire, donc n'utilisez cette méthode que si l'utilisation de Collections.UnmodifiableList ne répond pas à vos besoins.

Et gardez à l'esprit que ce sera un cauchemar lors du débogage, alors connectez-vous autant que possible.

4
Aditya

Vous avez besoin Java.util.Collections:

return Collections.unmodifiableList(oListeRet);

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

61
duffymo

Collections.unmodifiableList

Renvoie une vue non modifiable de la liste spécifiée. Cette méthode permet aux modules de fournir aux utilisateurs un accès "en lecture seule" aux listes internes. Les opérations de requête sur la liste retournée sont "lues" vers la liste spécifiée et les tentatives de modification de la liste retournée, qu'elles soient directes ou via son itérateur, entraînent une exception UnsupportedOperationException. La liste retournée sera sérialisable si la liste spécifiée est sérialisable. De même, la liste renvoyée implémentera RandomAccess si la liste spécifiée le fait.

18
Achintya Jha

Java-9 fournit une nouvelle méthode pour créer non modifiable/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)

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

6
Anton Balaniuc

Bien que la réponse acceptée réponde à la demande d'omettre/d'avaler le UnsupportedOperationException, il devrait y avoir une explication de pourquoi c'est une pratique indésirable.

1) L'intention générale d'avaler une exception est en contradiction avec le principe du "fail-fast". Au lieu de détecter et de détecter les défauts au début, ils sont simplement autorisés à passer "sous le tapis" en se transformant en bombes à retardement.

2) Ne pas lancer UnsupportedOperationException est une violation directe du contrat de List qui dit:

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: "Liste non modifiable en Java" devrait toujours être:

return Collections.unmodifiableList(oListeRet);
5
Alexey Dmitriev

Les commentaires sur la liste non modifiable sont corrects. Créez un accesseur de méthode qui appelle Collections.unmodifiableList. Cependant, vous pouvez simplement utiliser un tableau comme celui-ci et utiliser une liste en interne.

 public MyObject[] getObjects() {
    return (MyObject[]) mList.toArray();
 }
0
Joel Teply

1) Ces lignes n'ont aucun sens

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

2) Utilisez Collections.unmodifiableList.

return Collections.unmodifiableList(oListeRet);

Vous n'avez pas besoin d'attraper l'exception qu'il peut déclencher, ils sont tous UnsupportedOperationException - RuntimeExceptions

0