Fork me on GitHub

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 3 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 3 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)

 

posted @   氢氦  阅读(4931)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
点击右上角即可分享
微信分享提示