2010-02-02 21 views
43

De javadocs ImmutableList:¿Cuál es la diferencia entre ImmutableList de Google y Collections.unmodifiableList()?

A diferencia Collections.unmodifiableList (java.util.List), que es una vista de un recogida selectiva que todavía pueden cambiar, una instancia de ImmutableList contiene su propia privada datos y nunca cambio. ImmutableList es conveniente para listas estáticas públicas estáticas ("listas constantes") y también le permite hacer fácilmente una "copia defensiva" de una lista proporcionada a su clase por un llamador .

¿Significa que:

  1. si tengo ImmutableList de Dimensión objetos (por ejemplo), entonces no puedo cambiar cualquier objeto Dimensión en ella?
  2. y si tengo Collections.unmodifiableList (list) de objetos Dimension, entonces no solo puedo agregar o eliminar cualquier objeto, sino que puedo cambiarlos (por ejemplo, llamar al método setDimension (ancho, alto))?
+1

Es posible que también quiera echar un vistazo a [¿Cuál es la diferencia entre Collections.unmodifiableSet() y ImmutableSet of Guava] (http://stackoverflow.com/q/5611324/977087) – Crowie

Respuesta

52

No, la inmutabilidad solo se aplica a la cantidad y las referencias de los objetos en la Colección, y no aborda la mutabilidad de los objetos que coloca en la Colección.

Lo que la lista inmutable gana sobre el JDK Collections.unmodifiableList estándar es que al usar ImmutableList tiene la garantía de que los objetos a los que se hace referencia, su orden y el tamaño de la lista no pueden cambiar de ninguna fuente. Con Collections.unmodifiableList si algo más tiene una referencia a la lista subyacente, ese código puede modificar la lista aunque tenga una referencia a una lista no modificable.

Si, sin embargo, desea una verdadera inmutabilidad, debe completar la lista con objetos inmutables.

+0

Y, por supuesto, siempre hay reflexión ... – naiad

+0

@Vuntic, si la clase es realmente inmutable, sus campos se declaran definitivos, y la reflexión no puede cambiar eso. – Yishai

+1

@Yishai, la reflexión * puede * modificar los campos finales. Intentalo. – naiad

14

El uso de Collections.unmodifiableList crea un contenedor alrededor de su lista. si la lista subyacente cambia, también lo hace su vista de la lista no modificable.

Como dice la documentación, el código de Google crea una copia. Es un cálculo más caro y consume más memoria, pero si alguien altera la lista original, no puede afectar a la ImmutableList.

Ninguna de estas evitará que el cambio de un objeto en una lista, o no lo tenga, campos o campos de campos, etc.

+2

"Como dice la documentación, el código de Google crea una copia". Es * posible * crear una copia. Si el original también es una estructura de datos inmutable, en realidad podría ser capaz de reutilizarlo. Entonces, si usas 'ImmutableList' extensivamente, tocarás este caso muy a menudo y terminarás sin tener que copiar mucho. –

3
  1. No, los objetos individuales contenidos todavía puede ser modificado. Una colección realmente solo almacena referencias en los objetos contenidos, no una copia completa de cada objeto.
  2. Puede modificar la lista modificando la Colección principal a la que llamó Collections.unmodifiableList (list) en. Pero sí, PUEDE usar setDimension para cambiar un elemento de lista almacenado.
6

ImmutableList es similar a Collections.unmodifiableList(new ArrayList(list)). Tenga en cuenta que el recién creado ArrayList es no asignado a un campo o variable.

0

También es posible que desee echar un vistazo a this question (¿Cuál es la diferencia entre Collections.unmodifiableSet() y ImmutableSet de Guava).

Cuestiones relacionadas