ExternalType für Java-Code

Ein ExternalType-Abschnitt mit dem Stereotyp JavaObject definiert, wie Sie von Ihrem EGL-Code auf eine externe Java™-Klasse oder -Schnittstelle zugreifen können. Der Abschnitt gibt normalerweise alle öffentlichen Felder, Methoden und Konstruktoren der Klasse oder Schnittstelle an, kann aber auch ein Subset angeben, das von Interesse ist.

Syntax

Syntaxdiagramm für den externen Typ
Name
Der Name des externen Typs.
ExternalType
Ein externer Typ, der von dem aktuellen Typ erweitert oder implementiert wird, abhängig davon, ob ExternalType eine Java-Klasse oder -Schnittstelle darstellt. Der externe Typ, der definiert wird, enthält die Felder und Funktionsprototypen von ExternalType, nicht aber Konstruktorprototypen.

EGL definiert im Voraus den externen Typ Serializable, auf den Sie verweisen können, wenn Sie einen externen Typ definieren, der auf einer Java-Klasse basiert, die selbst die Schnittstelle java.io.Serializable implementiert. Wenn der externe Typ, den Sie definieren, den externen EGL-Typ Serializable nicht erweitert, werden alle EGL-Variablen, die auf diesem externen Typ basieren, im generierten Java-Code als 'transient' markiert. Transiente Variablen bleiben nicht erhalten, wenn ein Java-Objekt von einer Laufzeitplattform (wie z. B. einem Anwendungsserver) serialisiert wird. Eine Serialisierung kann z. B. erfolgen, wenn der Server als Reaktion auf einen Systemabschluss eine Sicherungskopie des Objekts erstellt.

Eigenschaft
Die folgenden abschnittsspezifischen Eigenschaften sind verfügbar:
packageName
Eine Zeichenfolge, die den Paketnamen für die externe Java-Klasse enthält.
javaName
Eine Zeichenfolge, die den Namen der Java-Klasse enthält. Diese Eigenschaft ist optional und nimmt standardmäßig den Namen des externen Typs an. Sie müssen aber in bestimmten Fällen einen angepassten Typnamen angeben (zum Beispiel, wenn der Klassenname ein für EGL reserviertes Wort ist). Außerdem müssen Sie in diesen Fällen die Eigenschaft javaName angeben.
static
Ein Indikator, der angibt, dass die Variable oder Funktion global für die Klasse gilt und nicht davon abhängt, ob die Klasse Objekte enthält. Sie können auf eine statische Variable oder Funktion zugreifen, indem Sie auf den externen Typ verweisen. Dies kann ohne Verweis auf ein Objekt (z. B. MyType.theStaticVariable) oder mit Verweis auf ein Objekt (z. B. MyObject.theStaticVariable) geschehen.
Konstruktorprototyp
Ein EGL-Funktionsprototyp, der einem Java-Konstruktor entspricht. Sie können folgende Arten von Parametern übergeben:
  • einen Primitive-Wert. Sie müssen den Änderungswert in angeben.
  • eine dynamische Feldgruppe. Sie können den Änderungswert in, out oder inout angeben.
  • einen strukturierten Datensatz. Sie müssen den Änderungswert inout angeben.
Funktionsprototyp
Ein EGL-Funktionsprototyp, der einer Java-Methode entspricht. Sie können folgende Arten von Parametern übergeben:
  • einen Primitive-Wert. Sie müssen den Änderungswert in angeben.
  • eine dynamische Feldgruppe. Sie können den Änderungswert in, out oder inout angeben.
  • einen strukturierten Datensatz. Sie müssen den Änderungswert inout angeben.

Die Funktion kann einen Primitive-Wert, eine Feldgruppe oder überhaupt keinen Wert zurückgeben. Die Funktion kann keinen Datensatz zurückgeben.

Variablenliste
Eine EGL-Variable oder durch Kommas getrennte Liste von EGL-Variablen. Jede EGL-Variable entspricht einem Java-Feld und kann auf einem Java-Primitive-Element, einem externen EGL-Typ oder einer Gruppe von Primitive-Elementen oder externen Typen basieren.
Variablen- oder Funktionsdeklarationen können die folgenden Eigenschaften beinhalten:
JavaName
Eine Zeichenfolge, die den Namen des zugehörigen Felds oder der zugehörigen Methode in der Java-Klasse enthält. Diese Eigenschaft ist optional und nimmt standardmäßig den Namen der Variablen oder Funktion in dem externen Typ an. Sie müssen aber in bestimmten Fällen einen angepassten Namen angeben (zum Beispiel, wenn der Feldname ein für EGL reserviertes Wort ist). Außerdem müssen Sie in diesen Fällen die Eigenschaft JavaName angeben. Beispiel:
Function nextElement() { JavaName = "next" };

Variablendeklarationen können auch die folgenden Komponenten enthalten:

@JavaProperty
@JavaProperty gibt an, dass der Feldzugriff im generierten Code durch Methodenaufrufe und nicht durch den direkten Zugriff auf das Feld erfolgt. Sie können diese Eigenschaft verwenden, ohne Funktionsnamen anzugeben, wenn die Namen der Funktionen mit dem Wort "get" oder "set" - gefolgt von dem Variablennamen - gebildet werden. Beispiel: Wenn es sich um die Variable UpperLimit handelt und die Java-Klasse die Funktionen getUpperLimit und setUpperLimit enthält, müssen Sie nur die komplexe Eigenschaft hinzufügen, wie aus folgendem Beispiel hervorgeht:
UpperLimit INT { @JavaProperty{} };
Die Eigenschaftsfelder in @JavaProperty sind:
getMethod
Eine Zeichenfolge, die den Namen der Get-Methode für die angegebene Variable enthält (geben Sie keine Klammern an). Die Methode hat keine Parameter und ihr Rückgabewert hat denselben Typ wie das Feld.
setMethod
Eine Zeichenfolge, die den Namen der Set-Methode für die angegebene Variable enthält (geben Sie keine Klammern an). Die Methode hat einen Parameter, der denselben Typ wie das Feld hat. Üblicherweise hat die Set-Methode keinen Rückgabewert, aber es resultiert auch keine Fehlerbedingung, wenn die Methode einen Wert zurückgibt.

Ein Feld kann nur gelesen werden, wenn getMethod angegeben wird, setMethod aber nicht. Und ein Feld kann nur geschrieben werden, wenn setMethod definiert ist, getMethod aber nicht. Ein Fehler ist die Folge, wenn Sie versuchen, den Wert eines Feld festzulegen, das nur gelesen werden kann, oder wenn Sie den Wert eines Feld abrufen möchten, das nur geschrieben werden kann.

@eventListener
Die komplexe Eigenschaft @eventListener gibt Ihnen oder Ihren Kollegen die Möglichkeit, einen Ereignishandler für eine Java-Umgebung zu schreiben, der dem EGL-Generator die Informationen zur Verfügung stellt, um Code zu erstellen, der dem Muster des Java-Ereignislisteners entspricht.

Betrachten Sie beispielsweise das java.beans-Paket, das ein Java-Entwickler verwendet, um eine Art Java-Klasse zu codieren, die normalerweise als Java-Bean oder einfach Bean bezeichnet ist. Zur Funktionalität einer Bean gehört z. B., dass sie die Methode eines Java-Objekts als Reaktion auf ein Laufzeitereignis aufrufen kann. Im weiteren Verlauf dieser Beschreibung wird davon ausgegangen, dass es sich bei dem Laufzeitereignis um eine Änderung eines Eigenschaftswerts in der Bean handelt.

Der Java-Entwickler registriert diese Art von Ereignis, indem er die Methode addPropertyChangeListener der Bean aufruft und ein Objekt PropertyChangeListener übergibt. Das Objekt PropertyChangeListener ist im Prinzip ein Ereignislistener.

Wenn sich ein Eigenschaftswert ändert, ruft die Bean den Ereignislistener auf. Konkret ruft die Bean die Methode propertyChange des Objekts PropertyChangeListener auf und übergibt ein Objekt PropertyChangeEvent, das Details über die Änderung zur Verfügung stellt.

Des Weiteren ist zu berücksichtigen, dass der Ereignislistener auf einer Java-Schnittstelle basiert und sich die Methode propertyChange speziell auf eine Geschäftsanwendung bezieht. Wenn der EGL-Entwickler die Eigenschaft @eventListener verwendet, bedeutet dies, dass die EGL-generierte Methode propertyChange Logik aufruft, die von einer EGL-Funktion abgeleitet ist, die der Entwickler codiert hat.

Beachten Sie vor diesem Hintergrund die Eigenschaftsfelder der Eigenschaft @eventListener:
addMethod
Eine Zeichenfolge, die den Namen der Java-Methode enthält, die einen Ereignislistener registriert. Verwenden Sie keine Klammern, wenn Sie die Methode angeben.

Im vorliegenden Beispiel hat addMethod den Wert “addPropertyChangeListener”.

listenerType
Eine Zeichenfolge, die den Namen einer Java-Klasse enthält, die als Listener fungiert. Geben Sie auch den Paketnamen für die Klasse an.

Im vorliegenden Beispiel hat listenerType den Wert “java.beans.PropertyChangeListener”.

method
Eine Zeichenfolge, die den Namen einer Java-Methode enthält, die im Listener enthalten ist und die aufgerufen wird, wenn das Ereignis eintritt.

Im vorliegenden Beispiel hat method den Wert “propertyChange”.

Im folgenden Beispiel wird EGL-Code gezeigt, der einen externen Typ für eine Bean mit dem Namen MyBean definiert. Der externe Typ beinhaltet ein Feld mit dem Namen onPropertyChange, das auf einem Stellvertreterabschnitt basiert, der später gezeigt wird:
ExternalType MyBean type JavaObject
   onPropertyChange PropertyChangeDelegate
      { @eventListener{ addMethod = "addPropertyChangeListener", 
                        listenerType = "java.beans.PropertyChangeListener", 
                        method = "propertyChange" } };
end

Das Feld onPropertyChange ist nicht Teil der Bean, aber es ist vorhanden, sodass das Listenermuster in Ihrem EGL-Code dort zur Verfügung steht, wo Sie die EGL-Funktion zuordnen, die bei Auftreten eines Ereignisses aufgerufen wird.

Entsprechend der Methode propertyChange hat der Stellvertreterabschnitt PropertyChangeDelegate einen einzelnen Parameter. Dabei handelt es sich um einen externen Typ, der auf dem Obkekt PropertyChangeEvent basiert.
Delegate PropertyChangeDelegate( evt PropertyChangeEvent in ) 
end

ExternalType PropertyChangeEvent type JavaObject { packageName = "java.beans" }
   function getPropertyName() returns ( string );
   // Sie können andere Methoden von java.beans.PropertyChangeEvent zur Verfügung stellen.
end
Das folgende EGL-Programm zeigt, wie der externe Typ MyBean verwendet wird:
program MyEGLProgram
   function main()
      mb MyBean{ onPropertyChange = propChange };
   end

   function propChange( evt PropertyChangeEvent in )
      writeStdout( "Property " :: evt.getPropertyName() :: " has changed." );
   end
end

Das Programm erstellt eine Variable des Typs MyBean, ordnet dem Feld onPropertyChange dieses Typs eine Funktion zu und definiert die Funktion selbst. Wenn sich ein Eigenschaftswert in der Bean ändert, wird die Funktion aufgerufen und verwendet getPropertyName, also die Methode, die vom Objekt PropertyChangeEvent zur Verfügung gestellt wurde.

Ordnen Sie die Eigenschaft @eventListener immer einer Variablen zu, die auf einem Stellvertreterabschnitt basiert. Die Merkmale des Stellvertreterabschnitts müssen einer Methode zur Behandlung von Ereignissen - wie z. B. propertyChange - entsprechen, die in einem bestimmten Java-Ereignislistener - wie z. B. PropertyChangeListener - enthalten ist.

Wenn Sie auf Java-Feldnamen und -Methodennamen im Code verweisen, müssen Sie die Groß-/Kleinschreibung beachten, auch wenn dies bei den entsprechenden EGL-Namen nicht erforderlich ist.


Feedback