Coding-Schnipsel

Per­sis­tie­ren von Instanzen

War­um soll ich in einer glo­ba­len Klas­se Instan­zen für ande­re Klas­sen verwalten?

Hier­für gibt es vie­le Anwen­dun­gen. So z.B. wenn ich in einer SAP-Stan­dard Anwen­dung eige­ne Daten erhal­ten und in z.B. BADIs wei­ter ver­wen­den möch­te. Die BADIs haben ein fixes Inter­face und so kann es sein dass nicht alle Daten dort im Zugriff sind um die gewünsch­te Erwei­te­rung zu implementieren.

Aber wie geht dass?
Zuerst wird eine glo­ba­le Klas­se z.B. <ZCL_INSTANCE> ange­legt. Die­se Klas­se ver­wal­tet die regis­trier­ten Instan­zen all­fäl­li­ger Klas­sen. Dafür muss die Klas­se <ZCL_INSTANCE> ein sta­ti­sches Attri­but haben in wel­chem zu einem Schlüs­sel die Instan­zen gehal­ten wer­den.
Des wei­te­ren braucht es eine Metho­de <GET_INSTANCE> die beim Instan­zie­ren all­fäl­li­ger Klas­sen auf­ge­ru­fen wird.
Inner­halb der Metho­de <GET_INSTANCE> wird, wenn eine Instan­zie­rung ange­fragt wird, in das Klas­sen­at­tri­but geschaut ob dort bereits eine Instan­zie­rung hin­ter­legt wur­de. Wenn Ja wird die­se Instanz an den Auf­ru­fer zurück­ge­ge­ben. Wenn nein wird die Instanz erzeugt und in das Klas­sen­at­tri­but geschrie­ben. Anschlie­ßend wird die Instanz an den Auf­ru­fer zurück gegeben.

Anle­gen der fina­len Klas­se ZCL_INSTANCE mit den Klas­sen­at­tri­bu­ten, 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.              

Imple­men­ta­ti­on 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.

Auf­ruf der per­sis­ten­ten Instan­zie­rung von Klas­sen 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> ).