加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

谈谈Flex中ArrayCollection的复制(克隆)

发布时间:2020-12-15 04:33:01 所属栏目:百科 来源:网络整理
导读:在Flex的开发过程中,常常会遇到复制ArrayCollection的情况。以前只是从网上找个方法拿来就用,也没有具体的搞清楚所以然来。今天有时间,研究了一下,总结如下: ??????? Flex中的复制同java一样,也分为深复制和浅复制。(如果您对java的深复制和浅复制理
在Flex的开发过程中,常常会遇到复制ArrayCollection的情况。以前只是从网上找个方法拿来就用,也没有具体的搞清楚所以然来。今天有时间,研究了一下,总结如下:

??????? Flex中的复制同java一样,也分为深复制和浅复制。(如果您对java的深复制和浅复制理解不深的话,可以参考我前一篇文章:JAVA中浅复制与深复制

??????? 下面总结一下ArrayCollection的浅复制,共有4种方法:

??????? 1、var newArray:ListCollectionView=new ListCollectionView(ListCollectionView(oldArray).list);

??????? 2、var newArray:ArrayCollection=new ArrayCollection(oldArray.source);

??????? 3、var newArray:ArrayCollection=new ArrayCollection(oldArray.source.slice());

??????? 4、var newArray:ArrayCollection=new ArrayCollection(oldArray.toArray());

??????? 以上方法中,第一种方法由于不是创建的独立的ArrayCollection对象,所以不推荐使用。第二、三、四种方法相似,可以参考使用。

??????? 有的时候,我们也会用到深复制,方法如下:

??????? var newArray:ArrayCollection=ArrayCollection(this.clone(oldArray));

??????? this.clone()方法定义如下:

?????????function clone(source:Object):*
???????? {
??????????????? var myBA:ByteArray = new ByteArray();
??????????????? myBA.writeObject(source);
??????????????? myBA.position = 0;
??????????????? return(myBA.readObject());
???????? }

下面是我测试以上程序的Flex程序代码,大家可以参考:

<?xml?version="1.0"?encoding="utf-8"?>

<mx:Application?xmlns:mx="http://www.adobe.com/2006/mxml"?creationComplete="initApp()"?layout="absolute">

????
<mx:Script>

????
<![CDATA[

????????import?mx.collections.ArrayCollection;

????????import?mx.collections.ListCollectionView;

????????import?mx.controls.Alert;

????????import?flash.utils.ByteArray;

????????

????????

????????public?function?initApp():void

????????{????????????

????????}

????????

????????

????????//开始测试:

????????//浅复制1

????????private?function?test1():void

????????{

????????????//初始化需要的对象

????????????var?obj1:Object=new?Object();//定义对象obj1

????????????var?obj11:Object=new?Object();//定义对象obj1的引用对象obj11

????????????obj1.name="obj1.name";

????????????obj1.sub=obj11;//obj1的sub属性引用obj11

????????????obj11.name="obj11.name";????????????

????????????//实例化ArrayCollection对象,并将obj1添加进该对象

????????????var?oldArray:ArrayCollection=new?ArrayCollection();

????????????oldArray.addItem(obj1);

????????????

????????????//浅复制ArrayCollection

????????????var?newArray:ListCollectionView=new?ListCollectionView(ListCollectionView(oldArray).list);

????????????

????????????//修改obj11.name的值

????????????obj11.name="obj11.name?is?changed!";

????????????

????????????//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制

????????????Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);

????????}

????????//浅复制2

????????private?function?test2():void

????????{

????????????//初始化需要的对象

????????????var?obj1:Object=new?Object();//定义对象obj1

????????????var?obj11:Object=new?Object();//定义对象obj1的引用对象obj11

????????????obj1.name="obj1.name";

????????????obj1.sub=obj11;//obj1的sub属性引用obj11

????????????obj11.name="obj11.name";????????????

????????????//实例化ArrayCollection对象,并将obj1添加进该对象

????????????var?oldArray:ArrayCollection=new?ArrayCollection();

????????????oldArray.addItem(obj1);

????????????

????????????//浅复制ArrayCollection

????????????var?newArray:ArrayCollection=new?ArrayCollection(oldArray.source);

????????????

????????????//修改obj11.name的值

????????????obj11.name="obj11.name?is?changed!";

????????????

????????????//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制

????????????Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);

????????}

????????

????????//浅复制3

????????private?function?test3():void

????????{

????????????//初始化需要的对象

????????????var?obj1:Object=new?Object();//定义对象obj1

????????????var?obj11:Object=new?Object();//定义对象obj1的引用对象obj11

????????????obj1.name="obj1.name";

????????????obj1.sub=obj11;//obj1的sub属性引用obj11

????????????obj11.name="obj11.name";????????????

????????????//实例化ArrayCollection对象,并将obj1添加进该对象

????????????var?oldArray:ArrayCollection=new?ArrayCollection();

????????????oldArray.addItem(obj1);

????????????

????????????//浅复制ArrayCollection

????????????var?newArray:ArrayCollection=new?ArrayCollection(oldArray.source.slice());

????????????

????????????//修改obj11.name的值

????????????obj11.name="obj11.name?is?changed!";

????????????

????????????//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制

????????????Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);

????????}

????????

????????//浅复制4

????????private?function?test4():void

????????{

????????????//初始化需要的对象

????????????var?obj1:Object=new?Object();//定义对象obj1

????????????var?obj11:Object=new?Object();//定义对象obj1的引用对象obj11

????????????obj1.name="obj1.name";

????????????obj1.sub=obj11;//obj1的sub属性引用obj11

????????????obj11.name="obj11.name";????????????

????????????//实例化ArrayCollection对象,并将obj1添加进该对象

????????????var?oldArray:ArrayCollection=new?ArrayCollection();

????????????oldArray.addItem(obj1);

????????????

????????????//浅复制ArrayCollection

????????????var?newArray:ArrayCollection=new?ArrayCollection(oldArray.toArray());

????????????

????????????//修改obj11.name的值

????????????obj11.name="obj11.name?is?changed!";

????????????

????????????//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制

????????????Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);

????????}

????????

????????//深复制

????????private?function?test5():void

????????{

????????????//初始化需要的对象

????????????var?obj1:Object=new?Object();//定义对象obj1

????????????var?obj11:Object=new?Object();//定义对象obj1的引用对象obj11

????????????obj1.name="obj1.name";

????????????obj1.sub=obj11;//obj1的sub属性引用obj11

????????????obj11.name="obj11.name";????????????

????????????//实例化ArrayCollection对象,并将obj1添加进该对象

????????????var?oldArray:ArrayCollection=new?ArrayCollection();

????????????oldArray.addItem(obj1);

????????????

????????????//浅复制ArrayCollection

????????????var?newArray:ArrayCollection=ArrayCollection(this.clone(oldArray));

????????????

????????????//修改obj11.name的值

????????????obj11.name="obj11.name?is?changed!";

????????????

????????????//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制

????????????Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);

????????}

????????

????????//深复制调用的方法

????????function?clone(source:Object):*

????????{

????????????var?myBA:ByteArray?=?new?ByteArray();

????????????myBA.writeObject(source);

????????????myBA.position?=?0;

????????????return(myBA.readObject());

????????}

????
]]>

????
</mx:Script>

????
<mx:Button?label="第一种浅复制方法"?click="test1()"?x="61"?y="36"/>

????
<mx:Button?label="第二种浅复制方法"?click="test2()"?y="57"?x="61"?width="114"/>

????
<mx:Button?label="第三种浅复制方法"?click="test3()"?y="78"?x="61"?width="114"/>

????
<mx:Button?label="第四种浅复制方法"?click="test4()"?y="98"?x="61"?width="114"/>

????

????
<mx:Button?label="深复制方法"?click="test5()"?y="147"?x="61"/>

</mx:Application>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读