Warum soll ich in einer globalen Klasse Instanzen für andere Klassen verwalten?
Hierfür gibt es viele Anwendungen. So z.B. wenn ich in einer SAP-Standard Anwendung eigene Daten erhalten und in z.B. BADIs weiter verwenden möchte. Die BADIs haben ein fixes Interface und so kann es sein dass nicht alle Daten dort im Zugriff sind um die gewünschte Erweiterung zu implementieren.
Aber wie geht dass?
Zuerst wird eine globale Klasse z.B. <ZCL_INSTANCE> angelegt. Diese Klasse verwaltet die registrierten Instanzen allfälliger Klassen. Dafür muss die Klasse <ZCL_INSTANCE> ein statisches Attribut haben in welchem zu einem Schlüssel die Instanzen gehalten werden.
Des weiteren braucht es eine Methode <GET_INSTANCE> die beim Instanzieren allfälliger Klassen aufgerufen wird.
Innerhalb der Methode <GET_INSTANCE> wird, wenn eine Instanzierung angefragt wird, in das Klassenattribut geschaut ob dort bereits eine Instanzierung hinterlegt wurde. Wenn Ja wird diese Instanz an den Aufrufer zurückgegeben. Wenn nein wird die Instanz erzeugt und in das Klassenattribut geschrieben. Anschließend wird die Instanz an den Aufrufer zurück gegeben.
Anlegen der finalen Klasse ZCL_INSTANCE mit den Klassenattributen, Typen und Methoden.
* mit den Typen
TYPES:
BEGIN OF GS_TY_REPO,
CLASS type program,
KEY type string,
REF type ref to object,
END OF GS_TY_REPO,
GT_TY_REPO type hasch table of GS_TY_REPO with unique key class key.
* und dem statischen Attribut
DATA:
gt_repo type gt_ty_repo.
* Anlegen der statischen Methode ( Sichtbarkeit PUBLIC )
METHODS:
GET_INSTANCE mit dem Interface
IMPORTING:
IV_CLASS TYPE PROGRAM
IV_KEY TYPE STRING
RETURNING:
RO_INSTANCE TYPE OBJECT,
*Anlegen der statischen privaten Methoden:
SET_ENTRY_TO_REPO mit dem Interface
IMPORTING:
IS_REPO TYPE GS_TY_REPO,
GET_ENTRY_FROM_REPO mit dem Interface
IMPORTING:
IV_CLASS type PROGRAM
IV_KEY type STRING
RETURNING:
RS_REPO type GS_TY_REPO.
Implementation der Methoden
METHOD GET_INSTANCE.
DATA(LS_REPO) = GET_ENTRY_FROM_REPO( IV_CLASS = IV_CLASS
IV_KEY = IV_KEY ).
IF LS_REPO IS INITIAL.
CREATE OBJECT RO_INSTANCE TYPE (IV_CLASS).
LS_REPO-CLASS = IV_CLASS.
LS_REPO-KEY = IV_KEY.
LS_REPO-REF = RO_INSTANCE.
SET_ENTRY_TO_REPO( LS_REPO ).
ELSE.
RO_INSTANCE = LS_REPO-REF.
ENDIF.
ENDMETHOD.
METHOD SET_ENTRY_TO_REPO.
INSERT IS_REPO INTO TABLE GT_REPO.
ENDMETHOD.
METHOD GET_ENTRY_FROM_REPO.
READ TABLE GT_REPO
WITH TABLE KEY CLASS = IV_CLASS
KEY = IV_KEY
INTO RS_REPO.
ENDMETHOD.
Aufruf der persistenten Instanzierung von Klassen im Report.
DATA(LO_INSTANCE) = ZCL_INSTANCE-GET_INSTANCE( IV_CLASS = <Name der zu instanzierenden Klasse>
IV_KEY = <Eindeutiger Schlüssel für die Instanz> ).
