List.copyOf
List liste non modifiable
Tu as demandé:
N'y a-t-il pas d'autre moyen d'attribuer une copie d'une liste
Java 9 a apporté les List.of
méthodes d'utilisation des littéraux pour créer une List
classe concrète inconnue et non modifiable .
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
Parallèlement à cela, nous avons également obtenu List.copyOf
. Cette méthode renvoie également une List
classe concrète inconnue et non modifiable .
List< String > colors = new ArrayList<>( 4 ) ; // Creates a modifiable `List`.
colors.add ( "AliceBlue" ) ;
colors.add ( "PapayaWhip" ) ;
colors.add ( "Chartreuse" ) ;
colors.add ( "DarkSlateGray" ) ;
List< String > masterColors = List.copyOf( colors ) ; // Creates an unmodifiable `List`.
Par «non modifiable», nous entendons le nombre d'éléments dans la liste, et le référent objet tenu dans chaque emplacement comme élément, est fixe. Vous ne pouvez pas ajouter, supprimer ou remplacer des éléments. Mais le référent objet contenu dans chaque élément peut ou non être mutable .
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
Découvrez ce code en direct sur IdeOne.com .
dates.toString (): [2020-02-02, 2020-02-03, 2020-02-04]
colours.toString (): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString (): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
Vous avez posé des questions sur les références d'objets. Comme d'autres l'ont dit, si vous créez une liste et l'affectez à deux variables de référence (pointeurs), vous n'avez toujours qu'une seule liste. Les deux pointent vers la même liste. Si vous utilisez l'un ou l'autre pointeur pour modifier la liste, les deux pointeurs verront ultérieurement les modifications, car il n'y a qu'une seule liste en mémoire.
Vous devez donc faire une copie de la liste. Si vous souhaitez que cette copie ne soit pas modifiable, utilisez la List.copyOf
méthode décrite dans cette réponse. Dans cette approche, vous vous retrouvez avec deux listes distinctes, chacune avec des éléments qui contiennent une référence aux mêmes objets de contenu. Par exemple, dans notre exemple ci-dessus utilisant des String
objets pour représenter des couleurs, les objets de couleur flottent quelque part en mémoire. Les deux listes contiennent des pointeurs vers les mêmes objets de couleur. Voici un schéma.
La première liste colors
est modifiable. Cela signifie que certains éléments pourraient être supprimés comme indiqué dans le code ci-dessus, où nous avons supprimé le 3e élément d'origine Chartreuse
(index de 2 = ordinal 3). Et des éléments peuvent être ajoutés. Et les éléments peuvent être modifiés pour pointer vers d'autres String
tels que OliveDrab
ou CornflowerBlue
.
En revanche, les quatre éléments de masterColors
sont fixes. Aucun retrait, aucun ajout et aucun remplacement d'une autre couleur. Cette List
implémentation n'est pas modifiable.