面向对象事件在ABAP中十分重要,并且很容易处理。

我们需要handler方法来注册事件:

METHODS : handle_event_raised FOR EVENT event_raised OF lcl_event_raiser.

然后把它设置为事件处理器:

SET HANDLER me->handle_event_raised FOR i_raiser.

ABAP开发者像上面这样使用事件处理器,但是其中的很多人不关心事件的解除注册。为什么我们需要注意事件的解除注册?

下面的简单代码可以解释事件处理的重要性:

CLASS lcl_event_raiser DEFINITION FINAL.
PUBLIC SECTION.
EVENTS : event_raised. CLASS-METHODS : start.
PRIVATE SECTION.
CLASS-DATA : m_object TYPE REF TO lcl_event_raiser. METHODS : raise_event.
ENDCLASS. CLASS lcl_event_handler DEFINITION FINAL.
PUBLIC SECTION.
METHODS : handle_event_raised FOR EVENT event_raised OF lcl_event_raiser. METHODS : constructor
IMPORTING
i_raiser TYPE REF TO lcl_event_raiser
i_number TYPE i. PRIVATE SECTION.
DATA : m_handler TYPE i.
ENDCLASS. CLASS lcl_event_raiser IMPLEMENTATION.
METHOD start.
CREATE OBJECT m_object. DO TIMES.
DATA(l_handler) = NEW lcl_event_handler( i_raiser = m_object
i_number = sy-index ).
m_object->raise_event( ).
FREE l_handler.
ENDDO. m_object->raise_event( ).
ENDMETHOD. METHOD raise_event.
RAISE EVENT event_raised.
ENDMETHOD.
ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION.
METHOD constructor.
SET HANDLER me->handle_event_raised FOR i_raiser.
me->m_handler = i_number.
ENDMETHOD. METHOD handle_event_raised.
WRITE : / me->m_handler.
ENDMETHOD.
ENDCLASS. START-OF-SELECTION. lcl_event_raiser=>start( ).

结果如下 :

如你所见,程序创建并且释放了第一个对象,但是触发事件依然捕捉到了这个对象。这是因为使用free释放对象是不够的。一旦对象的事件被注册,运行时会保有该对象,直到事件解除注册。

我们可以通过简单的代码解除注册:ACTIVATION SPACE。

只需要添加了一点点代码来处理对象:

........
* Definition part
METHODS : free.
........ ........
* Implementation Part
METHOD free.
SET HANDLER me->handle_event_raised FOR i_raiser ACTIVATION SPACE.
* Other data you want to clear, refresh or free
CLEAR : me->m_handler.
ENDMETHOD.

并且让start方法变为这样:

...........
METHOD start.
CREATE OBJECT m_object. DO TIMES.
DATA(l_handler) = NEW lcl_event_handler( i_raiser = m_object
i_number = sy-index ).
m_object->raise_event( ).
l_handler->free( ).
FREE l_handler.
ENDDO. m_object->raise_event( ).
ENDMETHOD.
.........

结果如下:

这样一来,我们就不需要额外关心事件的解除注册了。

想象下你需要处理两三个、甚至更多ALV,并且还要触发它们的一些事件的时候。如果你没有解除注册,运行时总会找到本该已释放的对象,这样就会导致dump、不必要的处理等等。为了避免这些情况,我们需要解除事件的注册。

本文链接:http://www.cnblogs.com/hhelibeb/p/6943343.html

原文标题:ABAP OO Event handling (register/unregister)

ABAP 面向对象事件处理的更多相关文章

  1. ABAP 面向对象(Object Orientation) OO

    [转自 http://blog.sina.com.cn/s/blog_7c7b16000101bhof.html]在程序中, 对象的识别和寻址是通过对象引用来实现的, 对象引用变量可以访问对象的属性和 ...

  2. ABAP OO的八大理由

    原贴地址:http://scnblogs.techweb.com.cn/abaplv/archives/127.html 几年前SAP BASIS 4.6为ABAP扩展了OO功能,这是很多传统的ABA ...

  3. ABAP单元测试最佳实践

    本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针.我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表. 在我的项目中,只使用传统的ABAP report. ...

  4. 我的BRF+自学教程(三):动态技术

    开发者们可以在编程中使用各种动态技术,比如RTTS,比如通过动态的类创建和多态来实现功能的平滑扩展.BRF+开发中也存在一些动态手段.本文将介绍3种不同场景下的动态实践方式.其中第一种是纯配置的,第二 ...

  5. [SAP ABAP开发技术总结]面向对象OO

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. 为什么ABAP开发者需要使用面向对象技术?

    ABAP对面向对象的支持已有十多年的历史,然而在生产实践中,我们对这门技术的应用十分有限. 一方面,面向过程的惯性长期存在着:另一方面,对于大部分二次开发工作而言,似乎并没有足够的理由促使开发者使用面 ...

  7. ABAP对象-面向对象(转)

    转自:https://www.jianshu.com/p/f847c8f71438 1 面向对象基础 不多赘述何为对象与类.简单回顾一下在面向对象特性. 封装 限定内部资源的可见性 多态 相同名称的方 ...

  8. ABAP技术总结

      SAP ——ABAP/4 技术总结 V3.0 2014-10-14 --江正军 1. 1.1. 1.1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 1.7. 1.7.1. 1.7.2. ...

  9. ABAP关键字SUBMIT的简单例子和学习小记

    网上有关SUBMIT实现程序调用的例子稍显复杂,而相关的参考和解释则不是很完善.本文给出一个SUBMIT的小示例程序(代码见文末),实现了最简单的程序间调用及返回值,以及SAP官方文档中相关内容的翻译 ...

随机推荐

  1. [TensorFlow] Introducing TensorFlow Feature Columns

    Welcome to Part 2 of a blog series that introduces TensorFlow Datasets and Estimators. We're devotin ...

  2. easyui combobox下拉列表的多选值

    html: <input id="cc" class="easyui-combobox" value="" data-options= ...

  3. 动手实现react Modal组件

    Modal组件 长话不多说,接下来让我们来动手实现一个react Modal组件. 我们先来看一下实际效果 Modal的布局 首先,让我们先思考下一个Modal组件的布局是怎么样的. 我们先拿一个基本 ...

  4. U3D Transform用法

    最近在学习unity3d,下面对Transform类做一个小结 一.常用属性和方法 1.1 常用属性: 用代码展示一下上面的一些属性,值得注意的是myCube是mySphere的父物体 using U ...

  5. CentOS7日期时间设置方法以及时间基本概念介绍

    在CentOS 6版本,时间设置有date.hwclock命令,从CentOS 7开始,使用了一个新的命令timedatectl. 一.基本概念 1.1 GMT.UTC.CST.DST 时间 (1) ...

  6. [PHP] 算法-快速排序的PHP实现

    快速排序: 1.基于二分的思想 2.第一个作为基准数,左右各一个指针,同时扫描,右边先走,找到比基准数小的停下 左边再走,找到比基准数大的停下,左右交换 3.当左右相遇的时候,把当前的和基准数调换,递 ...

  7. webpack4 系列教程(九): CSS Tree Shaking

    教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步原文地址 有空就来看看个人技术小站, 我一直都在 0. 课程介绍和资料 本次课程的代码目录(如下图所示): >>> ...

  8. 【 js 工具 】如何使用Git上传本地项目到github?(mac版)

    在此假设你已经在 github 上创建好了一个项目,像这样: 并且你已经完成了自己的项目代码, 同时你也已经安装了 git,然后 let's start. 首先,建一个文件夹比如文中演示的是 微信小程 ...

  9. js识别设备

    console.log(window.navigator); Navigator 对象属性         appCodeName     返回浏览器的代码名.         appMinorVer ...

  10. GitHub使用SSHkey进行连接

    SSH key的配置基本是我们使用git必备的配置,配置好可以避免频繁的在git push或者git pull的时候输入账号和密码 本来我的SSH key早就配置好了,结果他不起作用了,那就在配置一次 ...