2012-06-27 21 views
6

Estoy tratando de hacer un constructor de copia para un objeto y uno de los parámetros es una ArrayList.constructor de copia con el parámetro ArrayList

al crear el objeto ArrayList, tenía en mente usar el constructor ArrayList donde puede pasar una colección como parámetro, pero no estoy seguro si esto funcionará como un "puntero" a la lista de arrays o si esto va a crear todo un nuevo objeto ArrayList

este es el código que tengo

public MyObject(MyObject other) 
{ 
    this.brands= other.brands; 
    this.count = other.count; 
    this.list = new ArrayList<Integer>(other.list); // will this create a new array list with no pointers to other.list's elements? 

} 
+0

No hará copias de los elementos. (E imho opionion que sería extraño.) – esej

+2

Puede revisar el código fuente de ArrayList usted mismo. Está incluido con tu JDK. –

Respuesta

17

no estoy seguro de si esto funcionará como un "puntero" al ArrayList o si esto creará una Arraylist entero nuevo objeto

Cuando se utiliza new, que se crear un completamente nuevo ejemplo de ArrayList (esto es lo que ha pedido). Pero va a no también crea automáticamente copias de sus elementos (que creo que es lo que estás buscando). Lo que esto significa es que si cambia un objeto mutable en la nueva lista, también cambiará en la lista original, si todavía está alrededor. Esto se debe a que la Lista solo contiene referencias (un poco sorta pero no exactamente punteros) a los Object s en ellos, no a los Object propios.

Por ejemplo:

Person person = new Person("Rob"); // create a new Object 

List<Person> myList = new ArrayList<Person>(); 
myList.add(person); 

// Create another list accepting the first one 
List<Person> myList2 = new ArrayList<Person>(myList); 

for(Person p : myList2) { 
    p.setName("John"); // Update mutable object in myList2 
} 

person = new Person("Mary"); // stick another object into myList2 
myList2.add(person); 

for(Person p : myList2) { 
    System.out.println(p.getName()); // prints John and Mary as expected 
} 

for(Person p : myList) { 
    System.out.println(p.getName()); // prints only one result, John. 
} 

Así se puede ver que las dos listas mismos pueden ser modificados de forma independiente, pero cuando se utiliza el constructor aceptar otra List, tanto contendrá referencias a los mismos Person casos, y cuando el estado de estos objetos cambia en una lista, también cambiarán en la otra (algo así como punteros).

+0

Entonces, ¿cuál diría que es la mejor práctica para crear una nueva lista en un constructor de copias? Crear una nueva lista, iterar a través de la lista anterior y agregar nuevos objetos a la nueva lista? – ashishduh

+0

Bastante. Pruebe este enlace: http://stackoverflow.com/a/715660/473637 – Jeshurun

Cuestiones relacionadas