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官方文档中相关内容的翻译 ...
随机推荐
- IT人如何打造个性化的个人网站(在线简历)
前言 众所周知,IT行业人员在求职时,如果拥有自己的技术博客和个人网站多少是可以加些分的,因为这也是IT人的技术证明之一.内容丰富的技术博客就不必多少了,往往技术博客大神市场上多是供不应求的,而且技术 ...
- [JZOJ5837] Omeed
Description Solution 有两种做法 一种是线段树维护一次方程系数,一种是线段树维护矩阵 准备都写一写 维护系数 首先把式子推出来 \[CS=B\times \sum\limits_{ ...
- Ado.net怎么执行存储过程?
与ADO.Net执行SQL语句的地方只有两点不同1.使用存储过程名代替sql语句2. 使用查询对象SqlCommand,需配置一个CommandType属性 存储过程的执行语法-> exec 存 ...
- razor视图使用三元表达式
根据条件是否满足给input标签添加属性. <input type="radio" value="1" name="PortType" ...
- vb.bet 控件
TextBox1.BackColor = Color.White'设置控件的背景色(白色) TextBox1.BackColor = Color.Yellow'设置控件的背景色(黃色) TextBox ...
- C#服务端判断客户端socket是否已断开的方法
刚开始,用Socket类的Connected属性来实现,却发现行不通,connected只表示 是在上次 还是 操作时连接到远程主机.如果在这之后[连接的另一方]断开了,它还一直返回true, 除非 ...
- elasticsearch6.7 05. Document APIs(8)Multi Get API
7.Multi Get API(Multi Get API) multi GET API 允许你一次性获取多个文档,你需要指定docs数组,其中包含了所有你需要查询的文档,每个查询结构至少包含索引,类 ...
- 乐字节-Java8新特性之Date API
上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期 ...
- kafka结合Spark-streming的直连(Direct)方式
说明:此程序使用的scala编写 在spark-stream+kafka使用的时候,有两种连接方式一种是Receiver连接方式,一种是Direct连接方式. 两种连接方式简介: Receiver接 ...
- canvas-star3
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...