J'ai une question sur la construction de copie en Java. Considérez la classe suivante;
Dans le constructeur de copie, je peux dire new(Integer(other.id)) pour obtenir un nouvel objet entier transmis au constructeur, mais je ne peux pas dire new T(other.data) car le compilateur dira qu'il ne peut pas instancier le type T. Comment puis-je m'assurer que lorsque l'élément générique est construit par copie, il ne transmettra pas simplement une référence telle que les 2 objets partageront les données sous-jacentes.
De plus, dans la méthode getLinks, il fait un nouveau et crée un nouvel objet de la liste, mais est-ce que cela va copier en profondeur et créer un nouvel objet des éléments contenus dans la liste ou contiendra-t-il simplement des références aux éléments de liste d'objets existants tels que que vous avez 2 listes pointant toutes les deux vers les mêmes données. Voir ci-dessous les commentaires / code. Merci d'avance pour votre expertise.
Code :
- class DigraphNode<T>
- {
- Integer id;
- T data;
- ArrayList<DigraphNode<T> > links;
- public DigraphNode(Integer i)
- {
- id = i;
- links = new ArrayList<DigraphNode<T> >();
- }
- public DigraphNode(Integer i, T d)
- {
- id = i; data = d;
- links = new ArrayList<DigraphNode<T> >();
- }
- public DigraphNode(DigraphNode<T> other)
- {
- other.id = new Integer(other.id);
- other.data = other.data; // line in question
- this.links=other.getLinks(); // also will create a new list with references
- // or will it deep copy the items contained in the list?
- // see getLinks() method below
- }
- public void setData (T d ) { data = d; }
- public void addLink (DigraphNode<T> n) { links.add(n); }
- public void addLinks (ArrayList<DigraphNode<T> > ns) { links.addAll(ns); }
- public ArrayList<DigraphNode<T> > getLinks()
- {
- return new ArrayList<DigraphNode<T> >(links);
- }
- public void printNode()
- {
- System.out.print("Id: " + id + " links: " );
- for ( DigraphNode<T> i : links )
- {
- System.out.print(i.id + " " );
- }
- System.out.println();
- }
- }
|