2010-09-17 16 views
10
final Integer[] arr={1,2,3}; 
arr[0]=3; 
System.out.println(Arrays.toString(arr)); 

Me trató el código anterior para ver si las variables de una matriz definitiva pueden ser reasignados [ans: puede ser] .I entienden que por una final de enteros [] matriz que significa que no podemos asignar otro instancia de Integer [] aparte de la que hemos asignado inicialmente. Me gustaría saber si es posible hacer que las variables de la matriz también sean modificables.Java gama inmodificable

+2

La única manera de hacer que no se puede modificar arr es tomar un clon o copia del mismo y utilizar la copia. De esa forma, el original no cambiará. Por cierto: int [] puede ser una mejor opción que Integer [] aquí. –

+0

Compruebe mi respuesta aquí http://stackoverflow.com/a/16545097/326874 – aeracode

Respuesta

18

Esto no es posible hasta donde yo sé.

Sin embargo, existe un método Collections.unmodifiableList(..) que crea una vista inmodificable de p. Ej. a List<Integer>.

Si quiere garantizar que ni siquiera el creador de la lista de vistas no modificables podrá modificar la lista subyacente (modificable), eche un vistazo a Guava's ImmutableList.

+4

Esta es otra buena razón para utilizar colecciones en lugar de matrices. –

+2

@SkipHead Depende del objetivo que está programando. No todos los programas Java se ejecutan en un contenedor Java EE en algún mainframe grande. – Martin

+0

Consulte la documentación más reciente de ImmutableList de Guava en http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/index.html ya que los métodos add y addAll están en desuso. –

8

No. Se puede cambiar el contenido de una matriz. No puedes evitar eso.

tiene varios métodos para crear colecciones no modificables, pero no se proporcionan arreglos

4

La palabra clave final sólo evita cambiar la referencia arr, es decir, no se puede hacer:

final int[] arr={1,2,3}; 
arr = new int[5]; 

Si el arr objeto se refiere es objeto mutable (como las matrices), nada le impide modificar la misma.

La única solución es usar objetos inmutables.

0

La palabra clave 'final' se aplica solo a las referencias (puntero a la ubicación de memoria del objeto en el montón). No puede cambiar la dirección de memoria (ubicación) del objeto. Es hasta su objeto cómo maneja internamente la inmutabilidad.

Agregado, aunque int es un tipo de datos primitivo int [] debe tratarse como un objeto.

No se puede hacer esto

final int a = 5 
a = 6 

Usted puede hacer esto:

final int[] a = new int[]{2,3,4}; 
    a[0] = 6; 

No se puede hacer esto:

final int[] a = new int[]{2,3,4}; 
a = new int[]{1,2,3} 
0

Para cualquier otra persona leyendo esta vieja pregunta , tenga en cuenta que también hay colecciones inmutables de Google Guava. ImmutableList tiene un rendimiento mucho más fuerte que Collections.unmodifiableList(), y es posiblemente más seguro ya que es realmente inmutable y no está respaldado por una colección mutable.

0

Otra forma es utilizar esta función:

Arrays.copyOf(arr, arr.length);