面向對象事件在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)
