Heiner Kücker

Speicherklassen in Java

Home

Java-Seite

   Weiterentwicklung_Java

     NullPointer

     Algorithmische
     Symmetrie

     Finder_Feature

     Multiple_Interface
     Implementationen

     Proxy_Methoden

     Speicher_Klassen

   WebCam_Demo

   JSP WorkFlow
   PageFlow FlowControl
   Page Flow Engine
   Control_and_Command

   JSP_Spreadsheet

   Domain Parser

   Codegenerator_für
   hierarchische
   Datenstrukturen

   Expression_Engine
   Formula_Parser

   State Transition Engine

   AspectJ

   Java_Explorer

   DBF_Library

   Kalender_Applet

   SetGetGen

   BeanSetGet

   CheckPackage

   LineNumbers

   GradDms

   Excel-Export

   StringTokenizer

   JspDoc

   JspCheck

   JSP-Schulung
   Java Server Pages
   Struts

   AsciiTabellenLayouter

   StringSerial

   Silbentrennung

   JDBC_Schlüssel-
   Generierung

   bidirektional/
   unidirektional
   gelinkte Liste

   Java_Sitemap
   Generator

   XmlBuilder

   RangeMap

Alaska-XBase++-Seite

Projekte

Philosophien
Techniken


Konzepte

Sudoku

Kontakt /
Impressum


Links

SiteMap





Letzte Aktualisierung:
03.09.2002

Speicherklassen

Java besitzt drei Speicherklassen:

static -global allokierter Speicher
local -Variablen auf dem Methoden-Stack
dynamic/virtuell-Member-Variablen des aktuellen Objekt´s

Hinzu kommt die Unterteilung der lokalen und dynamischen Variablen auf verschiedene Threads.

Problem 1

Hier eine typische objektorientierte Architektur (nur nicht in UML gezeichnet):

Ein Servlet ruft einen PDF-Generator aus einem isolierten Framework auf. Dieser PDF-Generator bekommt Code eingelagert um Text und Optionen für Seitenköpfe und -füße, Spaltenköpfe und -inhalte, Gruppierungen, Summierungen usw. zu liefern.

Üblicherweise werden hier komplizierte Verknotungstechniken eingesetzt. Beispielweise könnten die eingelagerten Code-Teile mit Hilfe von Inferface-Callback-Hooks, die man über

  add(DataInterface paDataInterface)-Methoden
in das PDF-Framework einhängt, realisiert werden.
+------------------+          +------------------+          +------------------+
|                  |          |                  |          |                  |
| Servlet          |-------- >| PDF-Generator    |-------- >| Eingelagerter    |
|                  |          |                  |          | Code zum         |
|                  |          |                  |          | Liefern der      |
|                  |          |                  |          | Daten            |
|                  |          |                  |          |                  |
+------------------+          +------------------+          +------------------+
      |                                                          |
      |                                                          |
      +----------------------- <- View <- -----------------------+
Diese Lösung ist unübersichtlich und für jeden Request müssen für die Threadsicherheit neue Callback-Hook-Objekte erzeugt werden.

Problem 2

               +--------------------------------------+
               | Java-Server                          |
               |                                      |
               |                +--------+ Tabelle    |
               |                |        | mit        |
Request +      |                +--------+ Session-   |
Session-Ifo => | -------------> |        | objekten   |
               |                +--------+            |
               |  Zuordnung <-- |        |            |
               |  Session-      +--------+            |
               |  objekt        |        |            |
               |    |           +--------+            |
               |    |                                 |
               |    +-----> Aufruf Request mit        |
               |            Sessionobjekt             |
               +--------------------------------------+
Der Java-Server nimmt die Requests entgegen und ermittelt aus dem Request des Clients(Bowsers) die Session-Information, entnimmt aus einer Tabelle das entsprechende Session-Objekt und ruft mit diesem die Request-Methode auf.

Neben Servlet-JSP sind die Twister-RDO´s (Brokat) ein weiteres Beispiel für diese Arbeitsweise.

Wünschenswert wären also neben den oben erwähnten noch die Speicherklassen

request
session
In der Servlet-JSP-Technolgie werden diese Speicherklassen durch entsprechende lokale (per Parameter weitergegebene) Map-Variablen nachgebildet.

EJB verwendet mit stateless- und stateful-Session-Beans ein eigenes Modell. Demzufolge gilt mein Konzept nicht für EJB.

Meine Idee

Wie so oft existiert die Lösung schon. Deshalb ist meine Idee als Synergie zu klassifizieren.

Script-Sprachen und interpretierende Programmiersprachen wie BASIC besitzen einen RunTime-View. Dies gilt auch für die 4GL (Programmiersprachen der 4. Generation).

******************
funtion func1()

a = "A" // Setzen Variable a
b = func2()
retu b
******************
function func2()
return a * a // Variable a ist zur Laufzeit sichtbar
******************
Die Variablen werden in eine Liste aus Name und Wert (Key und Value) gelegt und sind für jede gerufene Prozedur/Funktion sichtbar.

Denkbare Spracherweiterungen

Der Runtime-Scope muß für jeden Thread getrennt exisiteren. Er könnte durch die Weitergabe von unsichtbaren Parametern realisiert werden:
public void method1(){
  SessionObject so=new SessionObject()
  Thread.setMagicMemory(so);
  method2(anyParameters);
}//end method1

private void method2(anyParameters){//zusätzlicher unsichtbarer Parameter magicMemory
  ...
  SessionObject so=Thread.getMagicMemory();
  ...
}//end method2
Die Methoden des fremden Frameworks geben bei jedem Aufruf transparent (unwissentlich) die versteckten Parameter weiter, bis die eingelagerten Codeteile darauf zugreifen und das Framework mit Daten versorgen.
//unsichtbare Weitergabe der Parameter für den Runtime-Scope
void strangeMethode(params(hidden params)){
  ...
  //unsichtbare Weitergabe der Parameter für den Runtime-Scope
  anotherStrangeMethod(params(hidden params));
  ...
}
Neben Speicherklassen für Request und Session könnten die unsichtbaren Parameter noch feiner granulierte Speicherklassen realisieren.

Sicherheitsregeln

Der neue Speicher benötigt Sicherheitsvorkehrungen. So muß gesichert werden, daß sich nicht die Objekte verschiedener Applikationsteile mischen. dafür benötigt man Namen und Namensräume. Die Objekte/Klassen im Runtime-Scope-Speicherraum könnten ein Interface mit einer boolean-Methode zur Zugriffserlaubnis implementieren. Dieser Methode müßte eine Information über das zugreifende Objekt/Klasse bekommen.

Ein einfacher Schutzmechanismus wäre die Beschränkung der Klassen-Sichtbarkeit auf die entsprechenden Packages. Bösartiger Code könnte sich der Introspection bedienen. Zum Schutz gegen Introspection ist auch ein Mechanismus über ein Acces-Schalter-Interface denkbar.

Realsierung mit vorhandenen Sprachmitteln

Die Thread-Klasse bekommt eine Erweiterung:
public void Thread.setSession( HashMap sessionHashMap )
public HashMap Thread.getSession()

public void Thread.setRequest( HashMap requestHashMap )
public HashMap Thread.getRequest()
Die HashMaps arbeiten analog wie die Request- und Session-HashMaps bei Servlet-JSP.

Der aktuelle Thread wird mit

  Thread.currentThread();
ermittelt.

Die Erweiterung kann leicht durch Vererbung realsiert werden. Alle Methoden die neue Threads erzeugen/starten müssen die HashMaps weitergeben. Hier ist es aber unbedingt notwendig, daß sich alle Code-Teile an die Regeln halten. Fremder Code ist evtl. problematisch.

Eine weitere Lösungsmöglichkeit ist die Verwendung der vom Java-API mitgelieferten Klasse ThreadLocal.

Vorteile

Der Runtime-Scope erlaubt einfachere Applikationsarchitekturen.

Weniger Callback-Klassen und weniger Code zum Verküpfen dieser Klassen könnte Speicher und Laufzeit sparen.

Nachteile

Variablen aus dem Runtime-Scope entziehen sich der Compiler-Prüfung, wodurch mehr Tests erforderlich werden.

Eine Lösung wären fest compilierte Klassen die den neuen Speicherklassen zugeordnet werden.

public request class AppRequestClass{

  BestellFormBean bestellFormBean;

  ...

}//end request class AppRequestClass
Dabei sinkt aber die Flexibiltät. Eventuell wird die Kontrolle auf NullPointer notwendig.

Hier der Thread auf de.comp.lang.java zu diesem Thema