Tengo una clase con varias variables miembro. Hay un constructor y hay métodos getter, pero no hay métodos setter. De hecho, este objeto debe ser inmutable.Objeto inmutable con la variable miembro ArrayList: ¿por qué se puede cambiar esta variable?
public class Example {
private ArrayList<String> list;
}
Ahora me di cuenta de lo siguiente: cuando llegue a la lista de variables con un captador-método, puedo añadir nuevos valores y así sucesivamente - Puedo cambiar el ArrayList
. Cuando llamo la próxima vez get()
para esta variable, se devuelve el ArrayList
cambiado. ¿Cómo puede ser esto? No lo puse de nuevo, ¡solo trabajé en eso! Con un String
, este comportamiento no es posible. Entonces, ¿cuál es la diferencia aquí?
yo sepa 'Collections.unmodifiableList()' devuelve una envoltura inmutable para la lista dada. Si estoy en lo correcto, lo anterior no garantizará la inmutabilidad. Una clase puede crear una instancia de una lista, instanciar un ejemplo y aún puede modificar la lista que contiene el ejemplo modificando la lista original pasada al constructor.Aunque la respuesta puede ser suficiente para abordar las diferencias, es posible que no cumpla con los estrictos requisitos de "inmutabilidad". – Maurice
Eso es correcto. Respuesta actualizada Puede hacer 'Collections.unmodifiableList (new ArrayList <> (listArg))' para asegurarse de que nadie contiene una referencia a la lista mutable subyacente y así evitar la mutabilidad. – aioobe