ABAP 面向对象事件处理
面向对象事件在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 面向对象事件处理的更多相关文章
- ABAP 面向对象(Object Orientation) OO
[转自 http://blog.sina.com.cn/s/blog_7c7b16000101bhof.html]在程序中, 对象的识别和寻址是通过对象引用来实现的, 对象引用变量可以访问对象的属性和 ...
- ABAP OO的八大理由
原贴地址:http://scnblogs.techweb.com.cn/abaplv/archives/127.html 几年前SAP BASIS 4.6为ABAP扩展了OO功能,这是很多传统的ABA ...
- ABAP单元测试最佳实践
本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针.我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表. 在我的项目中,只使用传统的ABAP report. ...
- 我的BRF+自学教程(三):动态技术
开发者们可以在编程中使用各种动态技术,比如RTTS,比如通过动态的类创建和多态来实现功能的平滑扩展.BRF+开发中也存在一些动态手段.本文将介绍3种不同场景下的动态实践方式.其中第一种是纯配置的,第二 ...
- [SAP ABAP开发技术总结]面向对象OO
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 为什么ABAP开发者需要使用面向对象技术?
ABAP对面向对象的支持已有十多年的历史,然而在生产实践中,我们对这门技术的应用十分有限. 一方面,面向过程的惯性长期存在着:另一方面,对于大部分二次开发工作而言,似乎并没有足够的理由促使开发者使用面 ...
- ABAP对象-面向对象(转)
转自:https://www.jianshu.com/p/f847c8f71438 1 面向对象基础 不多赘述何为对象与类.简单回顾一下在面向对象特性. 封装 限定内部资源的可见性 多态 相同名称的方 ...
- 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. ...
- ABAP关键字SUBMIT的简单例子和学习小记
网上有关SUBMIT实现程序调用的例子稍显复杂,而相关的参考和解释则不是很完善.本文给出一个SUBMIT的小示例程序(代码见文末),实现了最简单的程序间调用及返回值,以及SAP官方文档中相关内容的翻译 ...
随机推荐
- Zuul过滤器
1.Zuul过滤器生命周期Zuul大部分功能都是通过过滤器来实现的,Zuul定义了4种标准的过滤器类型,这些过滤器类型对应于请求的典型生命周期.a.pre: 这种过滤器在请求被路由之前调用.可利用这种 ...
- 配置文件热加载的go语言实现
通常我们更新应用程序的配置文件,都需要手动重启程序或手动重新加载配置.假设一组服务部署在10台机器上,你需要借助批量运维工具执行重启命令,而且10台同时重启可能还会造成服务短暂不可用.要是更新配置后, ...
- 在centos和redhat上安装docker
前置条件 64-bit 系统 kernel 3.10+一.检查内核版本,返回的值大于3.10即可 $ uname -r 二.使用 sudo 或 root 权限的用户登入终端 三.卸载旧版本(如果安装过 ...
- Jenkins持续集成学习-Windows环境进行.Net开发2
目录 Jenkins持续集成学习-Windows环境进行.Net开发2 目录 前言 目标 使用 .Net Stardard 单元测试 流程 手动执行单元测试 自动执行单元测试 单元测试报告 上传Nug ...
- Jenkins持续集成学习-Windows环境进行.Net开发4
目录 Jenkins持续集成学习-Windows环境进行.Net开发4 目录 前言 目标 Github持续集成 提交代码到Github 从Github更新代码 git上显示构建状态 自动触发构建 Gi ...
- cmd 导入数据库文件
mysql -uroot -p show databases use 库名 source D:\kuming.sql
- Keepalived原理与实战精讲
什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用 ...
- IIS7 开发与 管理 编程 之 Microsoft.Web.Administration
一.引言: 关于IIS7 Mocrosoft.Web.Administration 网上这方面详细资料相对来说比较少,大家千篇一律的(都是一篇翻译过来的文章,msdn 里面的实列没有).前段做了一个 ...
- DDD初探
领域驱动设计(DDD)对开发者来说是面向对象设计的自然进化 总的来说DDD包括两个部分: 分析部分 分析部分通常是由开发人员去和领域专家沟通业务知识,但是开发人员和领域专家是有代沟的, 为了简化沟通成 ...
- makefile中":=","=","?=","+="
= 无关位置的等于,值永远等于最后的值 比如: x =a y =$(x) x =b 那么y的值永远等于最后的值,等于 b ,而不是a := 有关位置的等于,值取决于当时位置的值 比如: ...