2013-08-08 1 views
1

Je ne comprends pas pourquoi le code suivant ne fonctionne pas. J'essaie de créer un nouvel objet en utilisant des éléments d'objet existants, puis de traiter le nouvel objet pour changer ses éléments. À la fin les deux objets sont changés. Qu'est-ce que je fais mal?Création d'un nouvel objet à partir d'un objet existant, comment les rendre indépendants - java

contours = new ArrayList<MatOfPoint>(); 
    hierarchy = new Mat(); 

    //find contours of filtered image using openCV findContours function 
    Imgproc.findContours(mFilteredFrameNoHoles, contours, hierarchy , Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 

    //Aproximate contours 
    aproximatedContours = new ArrayList<MatOfPoint>(contours); 
    //aproximatedContours = (ArrayList<MatOfPoint>) contours.clone(); 
    //aproximatedContours.addAll(contours); 

    aproximatedContours.doSomeOperations() 

Répondre

1

Parce que aproximatedContours et contours ont les mêmes références d'éléments.

aproximatedContours = new ArrayList<MatOfPoint>(contours); 

crée simplement une nouvelle liste avec les mêmes éléments dans les contours et si ces éléments sont mutated seront reflétés les effets dans une autre liste aussi.

Habituellement, c'est une mauvaise idée de lancer des objets mutables partagés comme celui-ci, sauf si vous connaissez vraiment les effets secondaires. L'exemple suivant illustre ce comportement:

class Foo{ 
     int val; 
     Foo(int x){ 
      val = x; 
     } 
     void changeVal(int x){ 
      val = x; 
     } 

     public static void main(String[] args) { 

      Foo f = new Foo(5); 
      List<Foo> first = new ArrayList<Foo>(); 
      first.add(f); 

      List<Foo> second = new ArrayList<Foo>(first); 

      System.out.println(first.get(0).val);//prints 5 
      second.get(0).changeVal(9); 
      System.out.println(first.get(0).val);//prints 9 

     } 

    } 
+0

Mais comment puis-je créer un nouvel objet à partir de l'ancien et les rendre non liés les uns aux autres? Je veux traiter les deux objets séparément ... – Marek

+0

Vous avez besoin d'une méthode de copie profonde personnalisée. Cela dit, ne comptez pas par défaut sur 'clone()' c'est une attraction! Il fait seulement une copie superficielle. Il faut toujours faire attention quand un objet avec état est partagé. – rocketboy

+0

Pouvez-vous expliquer comment exactement dois-je faire une telle copie? Je n'ai aucune idée. – Marek

Questions connexes