gx + java 中,結構體類型SDT(Struct Data Type)的Clone()方法使用

我們定義&SdtUser1,&SdtUser2 爲&SdtUser類型,Collection = false

&SdtUser1.UserCod = '0001'
    &SdtUser2 = &SdtUser1.Clone()//這句執行有效
    msg(&SdtUser2.UserCod)//執行,彈出0001
    &SdtUser2.UserCod = '9999'
    msg(&SdtUser1.UserCod)//執行,彈出  0001
    msg(&SdtUser2.UserCod)//執行,彈出9999

    可見,克隆後,改變新變量的值,不影響原變量。他們實際上在內存上是不同的地址。

 如果我們定義集合的sdt類型,情況就有所不同

我們結構體類型SDT(Struct Data Type)定義如下 :

SdtTest                               Colletion(True)

ColA               v(20)
ColB               N(10)
ColC              D(8)

我們再定義如下變量:

&SdtT1  ,&SdtT2  (    類型爲SdtTest   )
&SdtT1Item,&SdtT2Item (    類型爲SdtTest.Item   )
&i   (  類型爲 N(10)   )

代碼如下:

for &i = 1  to  &SdtT1.Count 
          &SdtT1Item = &SdtT1.Item(&i)
          &SdtT2.Add(&SdtT1Item.Clone())      
endfor

或者

for   &SdtT1Item  in &SdtT1
       &SdtT2.Add(&SdtT1Item.Clone())   
endfor

經過clone後,&sdtT1  和  &sdtT2的內容是一致的,但是他們所指向的內存地址不一樣。達到了數據的完全複製

,兩者獨立,即修改了&sdtT2不影響&sdtT2的值。

 

 

千萬要注意:我們不能對集合sdt直接用clone()賦值 ,如:   &sdtT2  = &sdtT1.Clone()

不妨大家試試!

Specify  沒有問題,編譯也沒有問題執行也沒問題,但是克隆出來我們需要調用數據,如 msg(&sdtT2.item(1).ColA),執行後會出錯,報

java.lang.NullPointerException

這說明&sdtT2  = &sdtT1.Clone()沒有執行效果,即&sdtT2沒有分配到內存地址。

只能用add方法。即&SdtT2.Add(&SdtT1Item.Clone())   

結論:我們可以這樣理解,clone的原對象必須是子集或非集合型。

如&SdtT1Item是子集,&SdtUser 本身就不是集合,當然是非集合型

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章