Aviso: He soltado un texto bastante grande. El principio es pura teoría de programación (explicando el por qué los
Array dan problemas como constantes) y al final te he dado una posible solución a tu problema.
Teoría
El problema de poner los
Array como constantes es que se pueden modificar igualmente. Esto se debe a que, cuando asignamos un array a una variable o a una constante, ésta almacena el
Array por referencia, no por valor. Me explicaré un poco mejor:
Cuando creas una variable de tipo
int, por ejemplo, haces:
Código ActionScript :
var entero:int = 3;
Y esa variable se almacena por valor. Para que me entiendas, en algún sitio de la memoria se escribe
entero vale 3. Si tú ahora haces:
Código ActionScript :
var otro:int = entero;
entero = 5;
Se guardaría
otro vale 3 y después
entero vale 5. Por tanto, lo único que se guarda es el valor del entero en cada momento. No obstante, si cambias el valor, estás modificando la variable. Éste es el motivo por el que, si declaramos un
int como constante, no podamos modificarlo (ya que modificar el valor modifica el
int).
Por el contrario, cuando escribimos el código:
Código ActionScript :
var lista:Array = new Array("a", "b", "c");
Lo que se hace es lo siguiente:
- Se guarda el Array con los valores "a", "b" y "c" en un lugar de la memoria (imaginemos que se guarda en la dirección número 100).
- Se guarda, en otro lugar de la memoria, lista es el Array de la dirección 100.
Si tú ahora haces:
Código ActionScript :
var otra:Array = lista;
lista = new Array("d", "e");
Se guarda
otra es el Array de la dirección 100 (ya que es la dirección de lista) y después se crea un
Array nuevo en otro lugar (por ejemplo, en la dirección 200) y se guarda
lista es el Array de la dirección 200.
En este caso, modificar (añadir, quitar o cambiar) los elementos del
Array no modifica el
Array en sí. Quiero decir, si tú escribes:
Código ActionScript :
otra.push("z");
Lo que se modifica es "el
Array de la dirección 100", pero no "otra". Sigue siendo válido que
otra es el Array de la dirección 100, como ya era antes, por eso no se considera que "otra" ha sido modificado.
En otras palabras, si tú declaras un
Array como constante, como en:
Código ActionScript :
public const lista:Array = new Array("a", "b", "c");
No podrás hacer lista=new Array() (ya que eso modificaría la dirección de "lista"), pero sí podrás hacer lista.push("d") (ya que "lista" seguirá siendo el mismo
Array, del cual sólo has modificado un elemento).
Posible solución
Lo único que se me ocurre es que encapsules el array. Puedes declararlo como privado y hacer que éste sólo sea accesible mediante un método que devuelva una copia de él. Por ejemplo:
Código ActionScript :
private const lista:Array = ["a", "b", "c"];
// ...
public function getLista():Array {
return this.lista.slice(); // el método slice lo utilizamos para crear una copia del array
}
De esta manera el programa nunca podrá modificar el
Array de tu clase, ya que para las otras clases tu
Array es privado. Sólo podrá modificar las copias de éste