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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM