Dann kann ich auch die Indizierung auf PRIVATE setzen und in GET_INSTANCE( ) mit dem Transaktionsgedöns anfangen (GET_INSTANCE( ) setzt ja kein Singleton voraus, ich kann damit auch beliebig viele Instanzen erzeugen). Dann ist aber nicht gesichert, dass die Transaktion auch korrekt abgebaut wird.ewx hat geschrieben:dann baue doch eine Service-Klasse drumherum.
Die Instanzerzeugung der eigentlichen Klasse setzt du auf PROTECTED.
Dann verbindest du Serviceklasse und ausführende Klasse durch FRIENDS.
Damit ist sichergestellt, dass die Instanz nur durch die Serviceklasse erzeugt werden darf.
Nein, kannst du nicht, weil GET_INSTANCE - wie du ja selber geschrieben hast - innerhalb der eigenen Klasse erfolgt. Mit der Serviceklasse kannst du sicherstellen, dass dein CL_OS_SYSTEM verwendet wird.ralf.wenzel hat geschrieben: Dann kann ich auch die Indizierung auf PRIVATE setzen und in GET_INSTANCE( ) mit dem Transaktionsgedöns anfangen (GET_INSTANCE( ) setzt ja kein Singleton voraus, ich kann damit auch beliebig viele Instanzen erzeugen).
Das ist richtig. Ist aber kein Argument gegen meine Lösung für die Kapselung.ralf.wenzel hat geschrieben:Dann ist aber nicht gesichert, dass die Transaktion auch korrekt abgebaut wird.
Das verstehe ich nicht - wenn ich GET_INSTANCE mit den Methodenaufrufen von CL_OS_SYSTEM beginne und erst dann das CREATE OBJECT mache, hab ich dieselbe Funktionalität wie mit einer Serviceklasse - aber eben ohne Serviceklasse.ewx hat geschrieben:Nein, kannst du nicht, weil GET_INSTANCE - wie du ja selber geschrieben hast - innerhalb der eigenen Klasse erfolgt. Mit der Serviceklasse kannst du sicherstellen, dass dein CL_OS_SYSTEM verwendet wird.
Doch - die gibt es. Aber da darfst du nichts drin machen, so dass es für dich de facto doch keine gibt ( Versuch doch einfach mal eine Methode mit dem Namen DESTRUCTOR anzulegen und schau was für Meldungen SAP in dem Fall für dich parat hat ).ralf.wenzel hat geschrieben:Wenn du jetzt noch eine hast, die ein definiertes LUW-Ende ermöglicht.... Leider gibt es im ABAP keine Destruktoren, die zwangsweise durchlaufen werden (wie ein Teardown bei Testklassen).
Wenn die Transaktion nicht im Kompatibilitätsmodus gestartet wird, sondern als OO Transaktion ist kein explizites Commit Work nötig. Somit benötigst Du auch keinen Destructor. Zumindest, wenn Du Dich mit dem Persistenzdienst rumschlagen willst.ralf.wenzel hat geschrieben:Moin,
ich möchte gern ein Objekt instanziieren, das in einer eigenen LUW operiert (damit ich ein auf dieses Objekt isoliertes COMMIT WORK auslösen kann). Dazu würde ich die Funktionalitäten der Klasse cl_os_system nutzen, um eine neue Transaktion zu erzeugen und zu starten.
Das muss ich aber vor dem CREATE OBJECT machen, wenn ich das richtig verstehe. Das gefällt mir insofern nicht, als dass ein Aufrufer daran denken muss (das widerspricht meiner Definition von einem in sich geschlossenen Modul, das "für sich selbst sorgt").
Lieber sähe ich das Erzeugen der separaten LUW z. B. im CONSTRUCTOR. Wenn ich im CONSTRUCTOR bin, ist es für das Erzeugen der LUW aber schon zu spät, oder? Wann GENAU wird die Instanz erzeugt / gibt es im CONSTRUCTOR noch einen Zeitraum, zu dem die Instanz noch nicht besteht?
Folgeproblem: Es gibt ja keinen DESTRUCTOR, den ich ausprogrammieren könnte, damit die LUW nicht ohne COMMIT WORK beendet wird (ein einfaches / implizites Abbauen der LUW hat ja keinen COMMIT WORK zur Folge, oder?)....
Ralf *mit Fragezeichen auf der Stirn
ralf.wenzel hat geschrieben:Das ist der Grund meiner FrageZwischen START und END muss ich halt mein Objekt instanziieren, dann soll es was machen und bei das END muss halt zuverlässig ausgeführt werden. Das soll das Objekt idealerweise alles selbst machen, damit der Aufrufer das nicht wissen muss, dass er das managen muss.
Ralf