Schwache Referenzen in ABAP

In meinem Blog-Post zum Singleton-Pattern mit Lebenszeit habe ich die WeakReference von Java verwendet. WeakReferences sind Referenzen auf ein Objekt, die durch den Garbage Collector ignoriert werden, d. h. wenn ein schwach referenziertes Objekt nicht anderweitig stark (herkömmlich per Referenzvariable) referenziert wird, wird es bei der Ausführung des Garbage Collectors durch diesen gelöscht.

Auch in ABAP gibt es schwache Referenzen, die nach diesem Muster funktionieren. Folgende Beispielklasse zeigt, wie eine schwache Referenz im Objektorientierten Umfeld eingesetzt werden kann.

ABAP Klasse: zcl_weak_referenced_writer
CLASS zcl_weak_referenced_writer DEFINITION.
  PUBLIC SECTION.
    METHODS write.

  PRIVATE SECTION.
    METHODS create_writer_instance.
    DATA mo_writer TYPE REF TO cl_abap_weak_reference.

ENDCLASS.


CLASS zcl_weak_referenced_writer IMPLEMENTATION.


  METHOD CREATE_WRITER_INSTANCE.
    DATA lv_string TYPE string.
    lv_string = sy-uzeit.
    CREATE OBJECT mo_writer EXPORTING oref = zcl_extended_writer=>get_instance( lv_string ).
  ENDMETHOD.


  METHOD WRITE.
    IF me->mo_writer->get( ) IS INITIAL.
        me->create_writer_instance( ).
    ENDIF.

    DATA lo_writer TYPE REF TO zcl_extended_writer.
    lo_writer ?= me->mo_writer->get( ).
    lo_writer->write( ).
  ENDMETHOD.


ENDCLASS.

Sie instanziiert ein Objekt des “ZCL_EXTENDED_WRITER” mit der aktuellen Uhrzeit als Text und speichert es in einer schwachen Referenz ab. Beim Aufruf von “write( )” wird die gespeicherte Uhrzeit ausgegeben. Wurde das Objekt bereits durch den Garbage Collector weggeräumt oder noch nie instanziiert, gibt der Methodenaufruf “get( )” in Zeile 28 eine Null-Referenz zurück (das zu referenzierte Objekt existiert immerhin nicht). In diesem Fall wird ein neues Writer-Objekt mit der aktuellen Uhrzeit erzeugt. Aufgrund der in ABAP fehlenden Möglichkeit der generischen Programmierung muss leider auch mit “?=” gecastet werden.

Der folgende Beispielcode zeigt die Verwendung der oben genannten Klasse.

DATA lo_weak_writer TYPE REF TO zcl_weak_referenced_writer.
CREATE OBJECT lo_weak_writer.

lo_weak_writer->write( ).
WAIT UP TO 5 SECONDS.
lo_weak_writer->write( ).
WAIT UP TO 5 SECONDS.
lo_weak_writer->write( ).
WAIT UP TO 5 SECONDS.
lo_weak_writer->write( ).

cl_abap_memory_utilities=>do_garbage_collection( ).

lo_weak_writer->write( ).
WAIT UP TO 5 SECONDS.
lo_weak_writer->write( ).

Das Statement in Zeile 12 löst explizit eine Bereinigung durch den Garbage Collector, und somit die Löschung des schwach referenzierten Objekts, aus.

Ergebnis eines Tests mit schwachen Referenzen in ABAP

Darüber hinaus gibt es in ABAP sog. “Soft References”. Diese stellen eine Sonderform – in gewisser Weise auch eine Optimierung – der Weak References dar, denn sie werden vom Garbage Collector nur wie eine schwache Referenz behandelt, wenn der Arbeitsspeicher knapp ist. Mit der CL_ABAP_SOFT_REFERENCE hat man also eine Referenzart, die es erlaubt, zu bestimmen, welche Objekte zur Laufzeit zwischenzeitlich gelöscht werden können, um ein Programm trotz eigentlich zu knappem Arbeitsspeicher ausführen zu können.

SAP zufolge ist die Soft Reference geplant, und, wie den NetWeaver-Systemen zu entnehmen ist, auch bereits implementiert. Allerdings entspricht die Implementierung derjenigen der CL_ABAP_WEAK_REFERENCE. Der Mehrwert in der Verwendung der Soft Reference liegt momentan noch lediglich in der Aussicht auf die Optimierung der Weak Reference.

Leave a Reply

Your email address will not be published. Required fields are marked *