从现有对象创建新对象,如何使它们独立 - java

时间:2013-08-08 06:14:57

标签: java android object opencv

我不明白为什么以下代码无效。 我试图使用现有的对象元素创建一个新对象,然后处理新对象以更改其元素。最后两个对象都改变了。我做错了什么?

    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()

1 个答案:

答案 0 :(得分:1)

因为aproximatedContourscontours具有相同的元素引用。

aproximatedContours = new ArrayList<MatOfPoint>(contours);

只需在轮廓中创建一个包含相同元素的新列表,如果这些元素为mutated,效果也会反映在另一个列表中。

除非你真的知道副作用,否则抛弃这样的共享可变对象通常是一个坏主意。以下示例演示了此行为:

    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

        }

    }