List.copyOf
➙ lista no modificable
Tu preguntaste:
¿No hay otra forma de asignar una copia de una lista?
Java 9 trajo los List.of
métodos para usar literales para crear una List
clase concreta inmodificable de desconocida.
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
Junto con eso también tenemos List.copyOf
. Este método también devuelve una List
clase de hormigón desconocido no modificable .
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`.
Por "no modificable" nos referimos al número de elementos en la lista, y el referente del objeto que se mantiene en cada espacio como elemento, es fijo. No puede agregar, quitar o reemplazar elementos. Pero el referente del objeto contenido en cada elemento puede o no ser mutable .
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
Vea este código en vivo en IdeOne.com .
date.toString (): [2020-02-02, 2020-02-03, 2020-02-04]
colors.toString (): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString (): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
Preguntaste sobre referencias de objetos. Como otros dijeron, si crea una lista y la asigna a dos variables de referencia (punteros), todavía tiene solo una lista. Ambos apuntan a la misma lista. Si usa cualquiera de los punteros para modificar la lista, ambos punteros verán más tarde los cambios, ya que solo hay una lista en la memoria.
Entonces necesita hacer una copia de la lista. Si desea que esa copia no sea modificable, utilice el List.copyOf
método como se describe en esta Respuesta. En este enfoque, terminas con dos listas separadas, cada una con elementos que contienen una referencia a los mismos objetos de contenido. Por ejemplo, en nuestro ejemplo anterior usando String
objetos para representar colores, los objetos de color están flotando en alguna parte de la memoria. Las dos listas contienen punteros a los mismos objetos de color. Aquí hay un diagrama.
La primera lista colors
es modificable. Esto significa que algunos elementos podrían eliminarse como se ve en el código anterior, donde eliminamos el tercer elemento original Chartreuse
(índice de 2 = ordinal 3). Y se pueden agregar elementos. Y los elementos se pueden cambiar para que apunten a otros String
como OliveDrab
o CornflowerBlue
.
En contraste, los cuatro elementos de masterColors
son fijos. Sin eliminación, sin adición y sin sustitución de otro color. Esa List
implementación no se puede modificar.