我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

121、对象引用与类型转换

121、对象引用与类型转换 121、对象引用与类型转换昨晚线上一个报表程序半夜报警,用户反馈某个库存汇总突然多出一倍。翻看dump日志,定位到一段很老的自定义函数,里面用DATA: ref TYPE REF TO object接收了ALV的某个字段目录对象,然后直接TRY. CAST type to ...,手法倒是正宗,但问题出在类型转换前先判断了ref IS NOT INITIAL,这个判断本身没错,错在它忽略了一个事实——对象引用一旦创建,哪怕指向一个空壳对象,引用变量也不会是initial。于是后面CAST成功后,取出内部表时其实是空表,但程序没报错,继续累加,结果把上一条记录又加了一遍。这种问题,不查对象生命周期根本看不出来。写ABAP的都知道,对象引用不同于值变量,它是个指针式的handle。你说ref IS NOT INITIAL,它只告诉你ref有没有被分配过引用,不告诉你那个引用指向的对象是不是你要的东西。这就像你手里拿着一张名片,名片是真的,但名片上的人已经离职了,你打电话过去,对面接起来说“你找谁”。很多刚接触面向对象的同事,第一步就是把对象引用当普通变量来比较,经常写出IF ref = ref2这种代码——语法能过,但比较的是引用地址,不是对象内容。除非你重写了EQUALS方法,否则两个内容完全一样的对象,用=比较,结果还是假。引用转换的坑,先从向上转型说起。子类对象赋给父类引用,这是自动的,不需要写CAST,因为子类天然“是一个”父类。但反过来,父类引用要变成子类引用,就必须显式转换。ABAP里给你
返回列表