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...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.
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.
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.
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.
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);
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
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();
}