[ABAP] OO: Statischer Konstruktor, Instanzkonstruktor, statischer und dynamischer Methodenaufruf

* Einfache Klasse für Demo des statischen Konstruktors und des Instanzkonstruktors
* sowie eines statischen und dynamischen Methodenaufrufs
CLASS lcl_demo DEFINITION.
  PUBLIC SECTION.
* Instanzkonstruktor
    METHODS:
      constructor.

* funktionale Instanzmethode, gibt Ergebnis zurück
    METHODS:
      add
        IMPORTING
                  i_var1        TYPE i
                  i_var2        TYPE i
        RETURNING VALUE(rv_erg) TYPE i.

    CLASS-METHODS:
* statischer Konstruktor
      class_constructor.

* statische funktionale Methode, gibt Ergebnis zurück
    CLASS-METHODS:
      mul
        IMPORTING
                  i_var1        TYPE i
                  i_var2        TYPE i
        RETURNING VALUE(rv_erg) TYPE i.
ENDCLASS.

CLASS lcl_demo IMPLEMENTATION.
  METHOD class_constructor.
    WRITE: / 'statischer Konstruktor'.
  ENDMETHOD.

  METHOD constructor.
    WRITE: / 'dynamischer Konstruktor'.
  ENDMETHOD.

  METHOD add.
    rv_erg = i_var1 + i_var2.
  ENDMETHOD.

  METHOD mul.
    rv_erg = i_var1 * i_var2.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

* erster Aufruf einer Methode der Klasse lcl_demo durch den Aufruf von mul( )
* -> ruft den Klassenkonstruktor, danach erst wird mul( ) statisch prozessiert
  WRITE: / lcl_demo=>mul( i_var1 = 4 i_var2 = 3 ).

* Objekt der Klasse lcl_demo erzeugen
  DATA(o_ref) = NEW lcl_demo( ).
* Methode add( ) aurufen
  WRITE: / o_ref->add( i_var1 = 2 i_var2 = 3 ).
* Methode mul( ) dynamisch prozessieren
  WRITE: / o_ref->mul( i_var1 = 2 i_var2 = 3 ).

[ABAP] OO: Implementation einer Singleton-Klasse

* Singleton-Klasse, kann durch den Zusatz CREATE PRIVATE nur sich selbst instanziieren
* stellt einen Spezialfall einer Factory-Klasse dar
CLASS lcl_singleton DEFINITION CREATE PRIVATE.
  PUBLIC SECTION.
* Statischer Konstruktor, wird nur einmal aufgerufen
* erzeugt genau eine Referenz auf Singleton-Objekt
    CLASS-METHODS:
      class_constructor.

* Factory-Methode -> Gibt immer die gleiche Referenz auf Singleton-Objekt zurück
    CLASS-METHODS:
      get_instance RETURNING VALUE(ret_singleton) TYPE REF TO lcl_singleton.

* Testmethode, gibt eine GUID zurück
    METHODS:
      get_guid RETURNING VALUE(ret_guid) TYPE sysuuid_c32.

  PRIVATE SECTION.
* Referenz auf Singleton-Objekt
    CLASS-DATA: o_singleton TYPE REF TO lcl_singleton.
ENDCLASS.

CLASS lcl_singleton IMPLEMENTATION.
* Statischer Konstruktor, wird nur einmal aufgerufen
* erzeugt genau eine Referenz auf Singleton-Objekt
  METHOD class_constructor.
    o_singleton = NEW #( ).
  ENDMETHOD.

* Factory-Methode -> Gibt immer die gleiche Referenz auf Singleton-Objekt zurück
  METHOD get_instance.
    ret_singleton = o_singleton.
  ENDMETHOD.

* Testmethode, gibt eine GUID zurück
  METHOD get_guid.
    TRY.
        ret_guid = cl_system_uuid=>create_uuid_c32_static( ).
      CATCH cx_root.
    ENDTRY.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA(o_ref) = lcl_singleton=>get_instance( ).

  WRITE: / |{ o_ref->get_guid( ) }|.